- // 圖像的寫操作把DIB寫入lpszPathName中
- // lpDib是指向信息頭的圖像指針
- BOOL WriteImageNew(LPCTSTR lpszPathName,LPBYTE lpDib)
- {
- // 信息頭指針
- LPBITMAPINFOHEADER lpBmpInfoHead;
- // 文件頭
- BITMAPFILEHEADER bmfh;
- // 指針類型轉換
- lpBmpInfoHead = (LPBITMAPINFOHEADER)lpDib;
- // 計算顏色表長度
- int nColorTableLength = ComputeColorTableLength(lpBmpInfoHead->biBitCount);
- // 文件類型"BM"
- bmfh.bfType = 0x4d42;
- bmfh.bfSize = 0;
- bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
- // 文件頭偏移量(從文件頭開始到實際圖像數據陣列字節間的字節偏移量)
- // 中間包括了文件頭、信息頭、調色板(真彩色圖像就沒有)
- bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nColorTableLength;
- HANDLE hFile;
- // 以寫的方式打開一個文件,不存在就創建新的
- hFile = CreateFile(lpszPathName, GENERIC_WRITE, 0, NULL,
- CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (INVALID_HANDLE_VALUE == hFile)
- return FALSE;
- // 寫入文件頭
- DWORD dwWrite;
- if (!WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWrite, NULL))
- return FALSE;
- // 寫入信息頭
- if (!WriteFile(hFile, lpBmpInfoHead, sizeof(BITMAPINFOHEADER), &dwWrite, NULL))
- return FALSE;
- // 調色板指針
- LPRGBQUAD lpColorTable = (LPRGBQUAD)lpBmpInfoHead+ sizeof(BITMAPINFOHEADER);
- // 如果顏色表長度不爲0就寫入調色板數據
- if (nColorTableLength != 0)
- if (!WriteFile(hFile, lpColorTable, sizeof(RGBQUAD)*nColorTableLength, &dwWrite, NULL))
- return FALSE;
- // 整幅圖像佔的字節大小
- // 像素點佔得字節數是4的整數倍
- // 可以這樣寫 (m_imgWidth*m_nBitCount/8+3)&~3;
- int imgBuffSize = (lpBmpInfoHead->biWidth*lpBmpInfoHead->biBitCount/8 + 3)/4*4*lpBmpInfoHead->biHeight;
- // 圖像像素指針
- unsigned char* pImgData = (unsigned char *)lpColorTable + sizeof(RGBQUAD)*nColorTableLength;
- // 寫入圖像像素數據
- if (!WriteFile(hFile, pImgData, imgBuffSize, &dwWrite, NULL))
- return FALSE;
- // 關閉文件句柄
- CloseHandle(hFile);
- return TRUE;
- }