保存hbitmap到文件
生活随笔
收集整理的這篇文章主要介紹了
保存hbitmap到文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
void SaveBitmapToFile(HBITMAP hBitmap, char* szfilename)
{HDC hdc; //設備描述表int ibits;WORD wbitcount; //當前顯示分辨率下每個像素所占字節數//位圖中每個像素所占字節數,定義調色板大小,位圖中像素字節大小,位圖文件大小 ,寫入文件字節數DWORD dwpalettesize = 0, dwbmbitssize, dwdibsize, dwwritten;BITMAP bitmap; //位圖屬性結構BITMAPFILEHEADER bmfhdr; //位圖文件頭結構BITMAPINFOHEADER bi; //位圖信息頭結構LPBITMAPINFOHEADER lpbi; //指向位圖信息頭結構//定義文件,分配內存句柄,調色板句柄HANDLE fh, hdib, hpal, holdpal = NULL;//計算位圖文件每個像素所占字節數hdc = CreateDC("display", NULL, NULL, NULL);ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);DeleteDC(hdc);if (ibits <= 1)wbitcount = 1;else if (ibits <= 4)wbitcount = 4;else if (ibits <= 8)wbitcount = 8;else if (ibits <= 16)wbitcount = 16;else if (ibits <= 24)wbitcount = 24;elsewbitcount = 32;//計算調色板大小if (wbitcount <= 8)dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);//設置位圖信息頭結構GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bitmap);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = bitmap.bmWidth;bi.biHeight = bitmap.bmHeight;bi.biPlanes = 1;bi.biBitCount = wbitcount;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;dwbmbitssize = ((bitmap.bmWidth * wbitcount + 31) / 32) * 4 * bitmap.bmHeight;//為位圖內容分配內存hdib = GlobalAlloc(GHND, dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);*lpbi = bi;// 處理調色板 hpal = GetStockObject(DEFAULT_PALETTE);if (hpal){hdc = ::GetDC(NULL);holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);RealizePalette(hdc);}// 獲取該調色板下新的像素值GetDIBits(hdc, hBitmap, 0, (UINT)bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwpalettesize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);//恢復調色板 if (holdpal){SelectPalette(hdc, (HPALETTE)holdpal, true);RealizePalette(hdc);::ReleaseDC(NULL, hdc);}//創建位圖文件 fh = CreateFile(szfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return false;// 設置位圖文件頭bmfhdr.bfType = 0x4d42; // "bm"dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +dwpalettesize + dwbmbitssize;bmfhdr.bfSize = dwdibsize;bmfhdr.bfReserved1 = 0;bmfhdr.bfReserved2 = 0;bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +(DWORD)sizeof(BITMAPINFOHEADER) + dwpalettesize;//寫入位圖文件頭WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);//寫入位圖文件其余內容WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);//清除 GlobalUnlock(hdib);GlobalFree(hdib);CloseHandle(fh);
}
?
總結
以上是生活随笔為你收集整理的保存hbitmap到文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咸粽子销量是甜粽子4倍上热搜 南北网友又
- 下一篇: STL内嵌数据类型: value_typ