調用實例:
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];
}
}
SaveBMP(m_octPngPath, pdata, m_iImgDataW, m_iImgDataH, 3);
實現函數:
// 函數名稱: SaveBMP
// 功能: 根據位圖數組生成一個位圖
// 輸入參數: fileName 所保存的位圖名稱(需加上擴展名)
// m_buf_tmp 位圖數組
// nwidth nheight iCount 位圖數組的寬度,高度,位數(注: 如24位位圖 iCount 應爲 3 )
// 返回值: 生成位圖文件成功 TRUE 否則 FALSE
BOOL SaveBMP(const CString fileName, const BYTE * m_buf_tmp, const UINT nwidth, const UINT nheight, const UINT iCount)//huangguihualogo
{
// 參數驗證
ASSERT(!fileName.IsEmpty() && m_buf_tmp != NULL && nwidth > 0 && nheight > 0 && iCount > 0);
bool bRVal = TRUE; // 返回值
BITMAPINFO *m_pBmpInfo = NULL;//位圖信息結構
BYTE *pInfoBuffer = NULL;
ReSize1dDataPointer(pInfoBuffer, sizeof(BITMAPINFO));
if (pInfoBuffer)
{
// m_pBmpInfo即指向m_chBmpBuf緩衝區,用戶可以自己分配BTIMAPINFO緩衝區
m_pBmpInfo = (BITMAPINFO *)pInfoBuffer;
//初始化BITMAPINFO 結構,此結構在保存bmp文件、顯示採集圖像時使用
m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
// 圖像寬度,一般爲輸出窗口寬度
m_pBmpInfo->bmiHeader.biWidth = nwidth;
m_pBmpInfo->bmiHeader.biHeight = nheight;
// 圖像位深度,
m_pBmpInfo->bmiHeader.biBitCount = iCount * 8;
// 對於低於8位的位圖,還應設置相應的位圖調色板
m_pBmpInfo->bmiHeader.biPlanes = 1;
m_pBmpInfo->bmiHeader.biCompression = BI_RGB;
m_pBmpInfo->bmiHeader.biSizeImage = nwidth*nheight*iCount;
m_pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biClrUsed = 0;
m_pBmpInfo->bmiHeader.biClrImportant = 0;
BITMAPFILEHEADER bfh = { 0 };
DWORD dwImageSize = 0;
DWORD dwBytesRead = 0;
dwImageSize = nwidth * nheight * iCount; //計算圖像大小,由視頻輸出窗口和視頻格式確定
bfh.bfType = (WORD)'M' << 8 | 'B'; //定義文件類型
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //定義文件頭大小
bfh.bfSize = bfh.bfOffBits + dwImageSize; //文件大小
try {
HANDLE hFile = ::CreateFile(fileName,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE)
{
bRVal = FALSE;
}
else
{
::WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL);
::WriteFile(hFile, m_pBmpInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL);
::WriteFile(hFile, m_buf_tmp, dwImageSize, &dwBytesRead, NULL);
CloseHandle(hFile);
}
}
catch (...)
{
bRVal = FALSE;
}
ReSize1dDataPointer(pInfoBuffer, 0);
}
else
{
bRVal = FALSE;
}
return bRVal;
}
本質與實現一是相同的。