保存图片函数,调用实例:
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);
BITMAPINFOHEADER bih;
memset(&bih, 0, sizeof(bih));
bih.biSize = sizeof(bih);
bih.biWidth = nWidth;
bih.biHeight = nHeight;
bih.biPlanes = 1;
bih.biBitCount = nColorBits;
DWORD dwWritten = 0;
WriteFile(hf, &bfh, sizeof(bfh), &dwWritten, NULL);
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;
参考文献: