WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Может кто, когда писал прогу для отображения BMP файлов

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Может кто, когда писал прогу для отображения BMP файлов
11 опубликован 14-02-2002 21:24 MSK   Click Here to See the Profile for 11   Click Here to Email 11  
Любые подсказки, ссылки или исходники принимаются с благодарностью
11 опубликован 14-02-2002 21:59 MSK     Click Here to See the Profile for 11  Click Here to Email 11     
Важно самому читать файл и распозновать заголовок и т.д.
SUnteXx опубликован 15-02-2002 01:18 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
МЫЛЬ МНЕ МЕССАГУ НА SUnteXx@pisem.net. У меня есть сорсик!
Drunkard опубликован 15-02-2002 02:09 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Когда-то давно писал одну большую прогу и в ней был вывод картинки из BMP файла в окно. Причем с линейками прокрутки, и функция в качестве параметра принимала контекст устройства, т.е. сразу для вывода на экран либо на принтер. Делал ее исключительно на API пользуясь только SDK (кстати все нормально описано как делать и есть примеры) и парой обычных книг. Так что и по документации можно разобраться.
А если код тебе бросать, то из-за давности его сотворения, я комментировать его не берусь, к тому же он будет наворочен разными ненужными тебе хреновинами, глобальными переменными и прочим калом, а вырезать все оттуда - влом. Ну в крайняк обращайси :)
Drunkard опубликован 15-02-2002 02:47 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Порылся в своем окаменевшем дерьме и вот тебе нарезал ливерухи :))
Дергайся в ентом направлении.
Основные вехи. Здесь не хватает анализа первых двух символов обозначающих 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     Click Here to See the Profile for 11  Click Here to Email 11     
Прибальсое пасибо всем!
clay_pigeon опубликован 15-02-2002 16:22 MSK     Click Here to See the Profile for clay_pigeon  Click Here to Email clay_pigeon     
Drunkard, а напиши часть кода где ты кидаешь это все на экран.
clay_pigeon опубликован 15-02-2002 16:41 MSK     Click Here to See the Profile for clay_pigeon  Click Here to Email clay_pigeon     
извиняй за беспокойство, я уже разобрался. Я так кинул:

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     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
clay<
Там есть такая строка
InvalidateRect(hwnd,&RectDisp,FALSE);
А в обработчике WM_PAINT пишешь свой BitBlt как ты привел.
Если пригодилось, то отлишно!
Vovan опубликован 16-02-2002 00:28 MSK     Click Here to See the Profile for Vovan  Click Here to Email Vovan     
Переходи на GDI+, там и .jpg и gif, и всё в пару строк умещаеться!
Rechkin опубликован 16-02-2002 00:48 MSK     Click Here to See the Profile for Rechkin  Click Here to Email Rechkin     
Мыль mailto:Rechkin@mail.ru
Вышлю кусок на API для работы с bmp!
clay_pigeon опубликован 16-02-2002 16:32 MSK     Click Here to See the Profile for clay_pigeon  Click Here to Email clay_pigeon     
Vovan,
Что такое GDI+ и с чем его едят?
SUnteXx опубликован 17-02-2002 00:49 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2 Vovan & ADK:
GDI+ это хорошо, но 1.5 мега с прогой в 100-200 кило тоскать - не есть серьёзно! Как-никак полтора мега лишних! Если прога весит 10 и более мегов, то ладо, но когда длл весит больше самой проги, то ... Может можно "кастрировать" GDI+? Мне нужно только савкать и считывать в *.jpg. Может у кого есть другие *.dll или *.lib или сорсец у кого-нить есть!?
wizzy опубликован 18-02-2002 01:19 MSK     Click Here to See the Profile for wizzy  Click Here to Email wizzy     
2 SUnteXx.
Есть прекрасные исходники из Stingray Objective Toolkit - класс SECJpeg. Если нету, могу кинуть конкретные файлы про jpg.
wizard@voxnet.ru

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.