Создание 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. Это самый лучший способ сохранить Ваши капиталы
2 коммент. к записи “Создание BMP из CBitmap”
Прокомментировать
Рубрики
- javascript
- SEO
- Smarty
- UIPI
- Боремся со СПАМом
- Верстка
- Движки форумов
- Железо
- Забавно
- Интернет в лицах
- Интернет-магазины
- Новости
- Обзоры сайтов
- Обо всем
- Полезные скрипты
- Работа с CMS
- Создание сайтов
- Уроки рекламы
- Шаблоны
Облако меток
сервер
деньги
страница
бот
файл
заказ
SEO
сайт
google
показ
веб
поисковик
pr
интернет
IE
эффект
блог
адрес
php
фон
магазин
форум
жк
бесплатно
товар
контент
продвижение
форма
html
проект

где же комментарии к коду, товарищ?
А они нужны?