保存內存數據爲jpg圖片:加上bmp頭然後轉換成opencv格式保存

windows C++保存位圖系列

思路:將內存數據加上bmp頭,然後用opencv轉換爲Mat格式,然後保存爲jpg圖片

此處圖像大小爲:width*height*4

咱們的數據是沒有bmp頭和調色板數據的位圖數據

CCameraShow* m_pShowCamera;
CStatic m_cameraShow1;
m_pShowCamera = new CCameraShow(&m_cameraShow1);
BYTE* m_pRGBCameraData = new BYTE[SIDE_CAMERA_IMG_WIDTH * SIDE_CAMERA_IMG_HEIGHT * 4];
unsigned char* pBmp32;
pBmp32 =m_pShowCamera->GetBmp32(m_pRGBCameraData,IDE_CAMERA_IMG_WIDTH, SIDE_CAMERA_IMG_HEIGHT);

USES_CONVERSION;
char* szBmpPath = W2A(strEyePosPic);
cv::Mat mt;
//位圖數據轉成mt格式
ProcessFile::DecodeIM(pBmp32, mt);
//保存jpg圖片	
ProcessFile::imwrite(szBmpPath, mt);

delete[] m_pRGBCameraData;

CStatic m_cameraShow1;是一個資源類主要用於顯示圖片,需要跟資源關聯:

void CDlgMotoControl::DoDataExchange(CDataExchange* pDX)
{
	CChildDialogBase::DoDataExchange(pDX);	
	DDX_Control(pDX, IDC_SHOW_IMG, m_cameraShow1);
}

給位圖數據加頭,加頭才方便識別,才能夠轉換成其他格式:

unsigned char* CCameraShow::GetBmp32(PBYTE pOCTData, int iWidth, int iHeight, BOOL upsideDown)
{
	if(m_pszBmp32 != NULL)
	{
		delete m_pszBmp32;
		m_pszBmp32 = NULL;
	}

	BITMAPFILEHEADER fileHeader;
	fileHeader.bfType = 0x4d42;
	fileHeader.bfReserved1 = 0;
	fileHeader.bfReserved2 = 0;
	fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO);
	fileHeader.bfSize = fileHeader.bfOffBits + iWidth * iHeight * 4;

	m_pszBmp32 = new unsigned char[fileHeader.bfSize];
	unsigned char * pHead = m_pszBmp32;
	memcpy(pHead, &fileHeader, sizeof(BITMAPFILEHEADER));
	pHead += sizeof(BITMAPFILEHEADER);

	// 解決圖像倒立問題
	BITMAPINFO bmiInfo;
	memcpy(&bmiInfo, m_pBitmapInfo, sizeof(BITMAPINFO));
	if (upsideDown) 
	{
		bmiInfo.bmiHeader.biHeight = -1 * bmiInfo.bmiHeader.biHeight;
	}
	memcpy(pHead, &bmiInfo, sizeof(BITMAPINFO));
	pHead += sizeof(BITMAPINFO);

	memcpy(pHead, pOCTData, iWidth * iHeight * 4);

	return m_pszBmp32;
}

將位圖數據轉換成opencv Mat格式:

void ProcessFile::DecodeIM(unsigned char* pBmp32, cv::Mat &mt)
{
	unsigned char *pTemp = pBmp32;

	BITMAPFILEHEADER bitMapHeader;
	BITMAPINFO bitMapInfo;

	memcpy(&bitMapHeader, pTemp, sizeof(BITMAPFILEHEADER));
	pTemp += sizeof(BITMAPFILEHEADER);

	memcpy(&bitMapInfo, pTemp, sizeof(BITMAPINFO));
	pTemp += sizeof(BITMAPINFO);

	int nSize = bitMapHeader.bfSize;

	std::vector<char> temp;
	for (int i = 0; i < nSize; ++i)
	{
		temp.push_back(pBmp32[i]);
	}

	cv::imdecode(temp, 1, &mt);
}

保存jpg圖片:

bool ProcessFile::imwrite(char* szFileName, cv::Mat &mt)
{
	return cv::imwrite(szFileName, mt);
}

 

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