怎么樣才能實現一個HBitmap的串行化????技術討論
熱心網友
我認為實現圖片串行化需要 1,不管什么格式的圖片只要獲得其DIB句柄 2,將其轉化為HBITMAP 3。按照BITMAP的格式創建結構體準備將結構變量串行化 4。獲得HBITMAP的數據區大小,并且動態申請改大小BYTE,然后將其串行化 5。完畢 請高手指教 --------------------------------------------------------------- 這是一段串行化HBITMAP的代碼 BOOL SaveBmp(HBITMAP hBitmap, CString FileName) { HDC hDC; //當前分辨率下每象素所占字節數 int iBits; //位圖中每象素所占字節數 WORD wBitCount; //定義調色板大小, 位圖中像素字節大小 ,位圖文件大小 , 寫入文件字節數 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位圖屬性結構 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 wBitCount = 24; GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); Size = sizeof(BITMAPINFOHEADER); Width = Width; Height = Height; Planes = 1; BitCount = wBitCount; Compression = BI_RGB; SizeImage = 0; XPelsPerMeter = 0; YPelsPerMeter = 0; ClrImportant = 0; ClrUsed = 0; dwBmBitsSize = (( Width * wBitCount + 31) / 32) * 4 * Height; //為位圖內容分配內存 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) Height, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢復調色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //創建位圖文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL ¦ FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 設置位圖文件頭 Type = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; Size = dwDIBSize; Reserved1 = 0; Reserved2 = 0; OffBits = (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); return TRUE; } 。