Создание BMP из CBitmap
Эта задача программирования не настолько тривиальна, как бы этого хотелось. Сложность заключается в том, что готовых 100% работающих классов или библиотек под эту задачу лично мне найти не удалось. Пришлось немного углубиться в поиски и адаптировать то, что с большего подходит под задачу создания BMP файла из элемента класса CBitmap.
Вот, что из этого у меня получилось:
1 | CBitmap bitmap; //Инициализируем, затем кидаем туда данные |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | BOOL StoreBitmapFile(LPCTSTR lpszFileName, HBITMAP HBM) { BITMAP BM; BITMAPFILEHEADER BFH; LPBITMAPINFO BIP; HDC DC; LPBYTE Buf; DWORD ColorSize,DataSize; WORD BitCount; HANDLE FP; DWORD dwTemp; GetObject(HBM, sizeof(BITMAP), (LPSTR)&BM); BitCount = (WORD)BM.bmPlanes * BM.bmBitsPixel; switch (BitCount) { case 1: case 4: case 8: case 32: ColorSize = sizeof(RGBQUAD) * (1 << BitCount); case 16: case 24: ColorSize = 0; } DataSize = ((BM.bmWidth*BitCount+31) & ~31)/8*BM.bmHeight; BIP=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFOHEADER)+ColorSize); BIP->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); BIP->bmiHeader.biWidth = BM.bmWidth; BIP->bmiHeader.biHeight = BM.bmHeight; BIP->bmiHeader.biPlanes = 1; BIP->bmiHeader.biBitCount = BitCount; BIP->bmiHeader.biCompression = 0; BIP->bmiHeader.biSizeImage = DataSize; BIP->bmiHeader.biXPelsPerMeter = 0; BIP->bmiHeader.biYPelsPerMeter = 0; if (BitCount < 16) BIP->bmiHeader.biClrUsed = (1<<BitCount); BIP->bmiHeader.biClrImportant = 0; BFH.bfType = 0x4d42; BFH. bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD); BFH.bfReserved1 = 0; BFH.bfReserved2 = 0; BFH.bfSize = BFH.bfOffBits + DataSize; Buf = (LPBYTE)GlobalAlloc(GMEM_FIXED, DataSize); DC = GetDC(0); GetDIBits(DC, HBM, 0,(WORD)BM.bmHeight, Buf, BIP, DIB_RGB_COLORS); ReleaseDC(0, DC); FP=CreateFile(lpszFileName,GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(FP,&BFH,sizeof(BITMAPFILEHEADER),&dwTemp,NULL); WriteFile(FP,BIP,sizeof(BITMAPINFOHEADER) + BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD),&dwTemp,NULL); WriteFile(FP,Buf,DataSize,&dwTemp,NULL); CloseHandle(FP); GlobalFree((HGLOBAL)Buf); HeapFree(GetProcessHeap(),0,(LPVOID)BIP); return(true); } |
Чтобы вызвать нашу функцию создания BMP файла пишем следующий код в нужном месте листинга программы:
1 | StoreBitmapFile("11111.bmp",(HBITMAP)bitmap->m_hObject); |
Пользуйтесь на здоровье
- Знаете какой самый скучный форум? Лично я уверен, что это не forumilla.net
- Сегодня цифровые наркотики затягивают не слабее, чем “нормальные”. Во всем мире уже в пору бить тревогу
- Элитная недвижимость в Испании от MyProperty. Это самый лучший способ сохранить Ваши капиталы
