保存內存數據爲bmp圖片:24位3通道

保存圖片函數,調用實例:

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;

參考文獻:

位圖BitMap圖像的讀取與存儲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章