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

windows C++保存位圖系列

調用實例:

    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;
}

本質與實現一是相同的。

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