Bitmap与IplImage之间的转换
-
在VC中利用OpenCV做圖像處理程序時,有時需要把IpImage 類型和CBitmap類型相互轉(zhuǎn)換,這樣就可以利用VC中的GDI+函數(shù)對圖像進行某些特殊的顯示和處理,非常方便。這里是本人項目中寫的兩個轉(zhuǎn)換小函數(shù),僅供參考,轉(zhuǎn)載注明,這樣方便發(fā)現(xiàn)問題的朋友聯(lián)系我及時修改。
IplImage轉(zhuǎn)換為CBitmap類型
CBitmap *IplImage2CBitmap(const IplImage *pImage)
{
if( pImage && pImage->depth == IPL_DEPTH_8U )
{
?? HDC hDC=GetDC(NULL);
?? uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
?? BITMAPINFO* bmi = (BITMAPINFO*)buffer;
?? int bmp_w = pImage->width, bmp_h = pImage->height;
?? FillBitmapInfo( bmi, bmp_w, bmp_h, pImage->depth*pImage->nChannels, pImage->origin );
??
?? char *pBits=NULL;
?? HBITMAP hBitmap=CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,(void**)&pBits,NULL,0);
?? memcpy(pBits,pImage->imageData,pImage->imageSize);
?? CBitmap *pBitmap=new CBitmap;
?? pBitmap->Attach(hBitmap);?? return pBitmap;
}
else
?? return NULL;
}void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
{
assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
memset( bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = origin ? abs(height) : -abs(height);
bmih->biPlanes = 1;
bmih->biBitCount = (unsigned short)bpp;
bmih->biCompression = BI_RGB;if( bpp == 8 )
{
?? RGBQUAD* palette = bmi->bmiColors;
?? int i;
?? for( i = 0; i < 256; i++ )
?? {
??? palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
??? palette[i].rgbReserved = 0;
?? }
}
}CBitmap轉(zhuǎn)換為IplImage類型
IplImage *CBitmap2IplImage(const CBitmap *pBitmap)
{
DIBSECTION ds;
pBitmap->GetObject(sizeof(ds),&ds);
IplImage *pImage=cvCreateImage(cvSize(ds.dsBm.bmWidth,ds.dsBm.bmHeight),8,ds.dsBmih.biBitCount/8);
memcpy(pImage->imageData,ds.dsBm.bmBits,pImage->imageSize);
return pImage;
}
總結(jié)
以上是生活随笔為你收集整理的Bitmap与IplImage之间的转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ffmpeg的使用
- 下一篇: 在MFC中添加用户自定义消息