思路:將內存數據加上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);
}