Автор
|
Тема: Может кто, когда писал прогу для отображения BMP файлов
|
11 |
опубликован 14-02-2002 21:24 MSK
Любые подсказки, ссылки или исходники принимаются с благодарностью
|
11
|
опубликован 14-02-2002 21:59 MSK
Важно самому читать файл и распозновать заголовок и т.д. |
SUnteXx
|
опубликован 15-02-2002 01:18 MSK
МЫЛЬ МНЕ МЕССАГУ НА SUnteXx@pisem.net. У меня есть сорсик! |
Drunkard
|
опубликован 15-02-2002 02:09 MSK
Когда-то давно писал одну большую прогу и в ней был вывод картинки из BMP файла в окно. Причем с линейками прокрутки, и функция в качестве параметра принимала контекст устройства, т.е. сразу для вывода на экран либо на принтер. Делал ее исключительно на API пользуясь только SDK (кстати все нормально описано как делать и есть примеры) и парой обычных книг. Так что и по документации можно разобраться. А если код тебе бросать, то из-за давности его сотворения, я комментировать его не берусь, к тому же он будет наворочен разными ненужными тебе хреновинами, глобальными переменными и прочим калом, а вырезать все оттуда - влом. Ну в крайняк обращайси :) |
Drunkard
|
опубликован 15-02-2002 02:47 MSK
Порылся в своем окаменевшем дерьме и вот тебе нарезал ливерухи :)) Дергайся в ентом направлении. Основные вехи. Здесь не хватает анализа первых двух символов обозначающих BMP файл. Сам его напишешь. Анализируй так: (WORD)0x4d42; // BM файл Учти что буквы ВМ переставлены местами!Вот код: hfbm=CreateFile(BmpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); ReadFile(hfbm,&bmfh,sizeof(BITMAPFILEHEADER),&dwRead,NULL); ReadFile(hfbm,&bmih,sizeof(BITMAPINFOHEADER),&dwRead,NULL); // Allocate memory for the BITMAPINFO structure. // Использую Virtual т.к. BMP файлы могут быть очень большими lpbmi=(LPBITMAPINFO)VirtualAlloc(NULL,sizeof(BITMAPINFOHEADER)+((DWORD)((WORD)1<<bmih.biBitCount)*sizeof(RGBQUAD)),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); // Load BITMAPINFOHEADER into the BITMAPINFO structure. lpbmi->bmiHeader.biSize = bmih.biSize; lpbmi->bmiHeader.biWidth = bmih.biWidth; lpbmi->bmiHeader.biHeight = bmih.biHeight; lpbmi->bmiHeader.biPlanes = bmih.biPlanes; lpbmi->bmiHeader.biBitCount = bmih.biBitCount; lpbmi->bmiHeader.biCompression = bmih.biCompression; lpbmi->bmiHeader.biSizeImage = bmih.biSizeImage; lpbmi->bmiHeader.biXPelsPerMeter = bmih.biXPelsPerMeter; lpbmi->bmiHeader.biYPelsPerMeter = bmih.biYPelsPerMeter; lpbmi->bmiHeader.biClrUsed = bmih.biClrUsed; lpbmi->bmiHeader.biClrImportant = bmih.biClrImportant; // Retrieve the color table. 1 << bmih.biBitCount == 2 ^ bmih.biBitCount if(bmih.biBitCount>(WORD)15) bmih.biBitCount=(WORD)((WORD)1<<bmih.biBitCount); if(bmih.biBitCount>(WORD)15) bmih.biClrUsed=(DWORD)0; ReadFile(hfbm,lpbmi->bmiColors,((bmih.biClrUsed)*sizeof(RGBQUAD)),&dwRead,NULL); // Allocate memory for the required number of bytes. lpvBits=(LPBYTE)VirtualAlloc(NULL,(DWORD)(bmfh.bfSize-bmfh.bfOffBits),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); // Retrieve the bitmap data. ReadFile(hfbm,lpvBits,(bmfh.bfSize-bmfh.bfOffBits),&dwRead,NULL); // Create a bitmap from the data stored in the .BMP file. hbm=CreateDIBitmap(hdc,&bmih,CBM_INIT,lpvBits,lpbmi,DIB_RGB_COLORS); // Set the fDisplayBitmap flag. if(hbm) fDisplayBitmap=TRUE; else { sprintf(Str,"Затрудняюсь создать битовый образ (BitMap)!"); MessageBox(hwnd,Str,"",MB_SYSTEMMODAL|MB_OK); goto Exit; }; if(Device==DevDISPLAY) { // Вернем линейки прокрутки в начало SendMessage(hwnd,WM_KEYDOWN,VK_HOME,0L); //Paint the window (and draw the bitmap). InvalidateRect(hwnd,&RectDisp,FALSE); UpdateWindow(hwnd); }; OK=TRUE; Exit: // Unlock the global memory objects and close the .BMP file. if(lpvBits) VirtualFree((LPVOID)lpvBits,NULL,MEM_RELEASE); if(lpbmi) VirtualFree((LPVOID)lpbmi,NULL,MEM_RELEASE); if(hfbm) CloseHandle(hfbm); if(Device==DevDISPLAY) ReleaseDC(hwnd,hdc);//Только для дисплея, т.к. он создан командой GetDC Вот и всё. С переменными и анализом ошибок, разберешся сам, читая SDK. Здесь есть лишние переменные - не обращай на них внимание. Могут быть недочеты, ну с кем не бывает :)). Во всяком случае она работает несколько лет под всеми Windами и на куче мониторов - нареканий нет :)) Помоему глючила только при цветовой гамме в 1 бит, т.е. черное и белое. Кто скажет почему, буду благодарен. А так испытывал на SVGA и VGA под разными цветовыми палитрами - все ОК. Ну, будь здоров. Не кашляй! :)
|
11
|
опубликован 15-02-2002 10:30 MSK
Прибальсое пасибо всем! |
clay_pigeon
|
опубликован 15-02-2002 16:22 MSK
Drunkard, а напиши часть кода где ты кидаешь это все на экран. |
clay_pigeon
|
опубликован 15-02-2002 16:41 MSK
извиняй за беспокойство, я уже разобрался. Я так кинул:CDC dcMemory; dcMemory.CreateCompatibleDC(&hdc); dcMemory.SelectObject(hbm); hdc.BitBlt(10, 10, lpbmi->bmiHeader.biWidth, lpbmi->bmiHeader.biHeight, &dcMemory,0, 0,SRCCOPY); DeleteObject(dcMemory);
|
Drunkard
|
опубликован 15-02-2002 17:46 MSK
clay< Там есть такая строка InvalidateRect(hwnd,&RectDisp,FALSE); А в обработчике WM_PAINT пишешь свой BitBlt как ты привел. Если пригодилось, то отлишно! |
Vovan
|
опубликован 16-02-2002 00:28 MSK
Переходи на GDI+, там и .jpg и gif, и всё в пару строк умещаеться! |
Rechkin
|
опубликован 16-02-2002 00:48 MSK
Мыль mailto:Rechkin@mail.ru Вышлю кусок на API для работы с bmp! |
clay_pigeon
|
опубликован 16-02-2002 16:32 MSK
Vovan, Что такое GDI+ и с чем его едят? |
SUnteXx
|
опубликован 17-02-2002 00:49 MSK
2 Vovan & ADK: GDI+ это хорошо, но 1.5 мега с прогой в 100-200 кило тоскать - не есть серьёзно! Как-никак полтора мега лишних! Если прога весит 10 и более мегов, то ладо, но когда длл весит больше самой проги, то ... Может можно "кастрировать" GDI+? Мне нужно только савкать и считывать в *.jpg. Может у кого есть другие *.dll или *.lib или сорсец у кого-нить есть!? |
wizzy
|
опубликован 18-02-2002 01:19 MSK
2 SUnteXx. Есть прекрасные исходники из Stingray Objective Toolkit - класс SECJpeg. Если нету, могу кинуть конкретные файлы про jpg. wizard@voxnet.ru |