【转帖】请教:自定义位图类怎样保存成bmp文件
我用COLORREFP定义成一维数组,从bmp中读取颜色值,修改后,请问将其如何保存到文件中去?
--------------------------------------------------------------- http://www.vckbase.com/code/listcod...id=7&sclsid=705 --------------------------------------------------------------- SaveFile(HDC hdc, HBITMAP hBitmap, CString strFileName) { HDC hDC; int iBits; WORD wBitCount; DWORD dwPaletteSize=0; DWORD dwBmBitsSize, dwDIBSize, dwWritten; BITMAP Bitmap; BITMAPFILEHEADER bmfHdr; BITMAPINFOHEADER bi; LPBITMAPINFOHEADER lpbi; HANDLE hFile, hDib, hPal,hOldPal=NULL; try { int ilength = strFileName.Find(":\\"); ilength = strFileName.Find("\\",ilength+2); while(ilength !=-1) { CString strDirectory =strFileName.Left(ilength); CFileFind FileFind; if(!FileFind.FindFile(strDirectory,0)) if(!CreateDirectory(strDirectory,NULL)) { ::MessageBeep(MB_ICONHAND); AfxMessageBox("フォルダクリエートに失敗しました。", NULL, MB_OK + MB_ICONSTOP + MB_SYSTEMMODAL); } else return FALSE; ilength = strFileName.Find("\\",ilength+1); } 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 <= 24) wBitCount = 24; else if (iBits <= 32) wBitCount = 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); // CClientDC dc(this); GetDIBits(hdc, hBitmap, 0, (UINT) Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize,(BITMAPINFO *)lpbi, DIB_RGB_COLORS); hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hFile == INVALID_HANDLE_VALUE) return FALSE; bmfHdr.bfType = 0x4D42; 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(hFile, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); WriteFile(hFile, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL); GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(hFile); } catch(...) { return FALSE; } return TRUE; } |
所有的时间均为北京时间。 现在的时间是 09:05 PM. |