调用实例:
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;
}
本质与实现一是相同的。