保存圖片函數,調用實例:
ProcessFile::SaveBitmapToFile(dsr.m_pData, 24,m_szFileName,VEDIOWIDTH, VEDIOHEIGHT)
注:第二個參數必須爲24,如果換成8,存圖會出錯。
另外,這個函數可以同時保存爲jpg格式和bmp格式。
如果想用此函數保存8位灰度圖,需要將8位圖片轉成3通道圖片:
BYTE *pdata = new BYTE[m_iImgDataW * m_iImgDataH * 3];
int k = 0;
//保存mtsd和png文件
int iCount = 3;
int iPos = 0;
int iWNum = m_iImgDataW * 3;
for (int i = 0; i< m_iImgDataW; ++i)
{
iPos = i * iCount;
for (int j = 0; j< m_iImgDataH; ++j)
{
k = j * iWNum + iPos;
pdata[k] = (BYTE)m_ppImgData[i][j];
pdata[k + 1] = (BYTE)m_ppImgData[i][j];
pdata[k + 2] = (BYTE)m_ppImgData[i][j];
}
}
保存內存數據爲bmp圖片
BOOL ProcessFile::SaveBitmapToFile(BYTE *pBuffer, int nColorBits,CString m_szFileName, int nWidth, int nHeight)
{
HANDLE hf = CreateFile(
m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, NULL, NULL);
if (hf == INVALID_HANDLE_VALUE) return 0;
int lBufferSize = nWidth * nHeight * (nColorBits / 8);
BITMAPFILEHEADER bfh;
memset(&bfh, 0, sizeof(bfh));
bfh.bfType = 'MB';
bfh.bfSize = sizeof(bfh) + lBufferSize + sizeof(BITMAPINFOHEADER);
bfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
DWORD dwWritten = 0;
WriteFile(hf, &bfh, sizeof(bfh), &dwWritten, NULL);
BITMAPINFOHEADER bih;
memset(&bih, 0, sizeof(bih));
bih.biSize = sizeof(bih);
bih.biWidth = nWidth;
bih.biHeight = nHeight;
bih.biPlanes = 1;
bih.biBitCount = nColorBits;
WriteFile(hf, &bih, sizeof(bih), &dwWritten, NULL);
// 寫??位?圖a?數oy據Y
WriteFile(hf, pBuffer, lBufferSize, &dwWritten, NULL);
CloseHandle(hf);
return 1;
}
位圖信息頭BITMAPINFOHEADER:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
biPlanes 必須是1,不用考慮。
biBitCount 指定表示顏色時要用到的位數,常用的值爲1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,這裏就不做討論了)。
biBitCount是圖像的位數,例如24位,8位等
位圖文件頭BITMAPFILEHEADER:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
參考文獻: