保存hbitmap到文件
生活随笔
收集整理的這篇文章主要介紹了
保存hbitmap到文件
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
void SaveBitmapToFile(HBITMAP hBitmap, char* szfilename)
{HDC hdc; //設(shè)備描述表int ibits;WORD wbitcount; //當(dāng)前顯示分辨率下每個(gè)像素所占字節(jié)數(shù)//位圖中每個(gè)像素所占字節(jié)數(shù),定義調(diào)色板大小,位圖中像素字節(jié)大小,位圖文件大小 ,寫入文件字節(jié)數(shù)DWORD dwpalettesize = 0, dwbmbitssize, dwdibsize, dwwritten;BITMAP bitmap; //位圖屬性結(jié)構(gòu)BITMAPFILEHEADER bmfhdr; //位圖文件頭結(jié)構(gòu)BITMAPINFOHEADER bi; //位圖信息頭結(jié)構(gòu)LPBITMAPINFOHEADER lpbi; //指向位圖信息頭結(jié)構(gòu)//定義文件,分配內(nèi)存句柄,調(diào)色板句柄HANDLE fh, hdib, hpal, holdpal = NULL;//計(jì)算位圖文件每個(gè)像素所占字節(jié)數(shù)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;//計(jì)算調(diào)色板大小if (wbitcount <= 8)dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);//設(shè)置位圖信息頭結(jié)構(gòu)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;//為位圖內(nèi)容分配內(nèi)存hdib = GlobalAlloc(GHND, dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);*lpbi = bi;// 處理調(diào)色板 hpal = GetStockObject(DEFAULT_PALETTE);if (hpal){hdc = ::GetDC(NULL);holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);RealizePalette(hdc);}// 獲取該調(diào)色板下新的像素值GetDIBits(hdc, hBitmap, 0, (UINT)bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwpalettesize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);//恢復(fù)調(diào)色板 if (holdpal){SelectPalette(hdc, (HPALETTE)holdpal, true);RealizePalette(hdc);::ReleaseDC(NULL, hdc);}//創(chuàng)建位圖文件 fh = CreateFile(szfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return false;// 設(shè)置位圖文件頭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);//寫入位圖文件其余內(nèi)容WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);//清除 GlobalUnlock(hdib);GlobalFree(hdib);CloseHandle(fh);
}
?
總結(jié)
以上是生活随笔為你收集整理的保存hbitmap到文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 咸粽子销量是甜粽子4倍上热搜 南北网友又
- 下一篇: RNG运营负责人回应Bin离队:不会做伤