IplImage 与 CBitmap类 的相互转换



在VC中利用OpenCV做图像处理程序时,有时需要把IpImage 类型和CBitmap类型相互转换,这样就可以利用VC中的GDI+函数对图像进行某些特殊的显示和处理,非常方便。这里是本人项目中写的两个转换小函数,仅供参考,转载注明,这样方便发现问题的朋友联系我及时修改。

IplImage转换为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转换为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;

}

IplImage 与 CBitmap类 的相互转换,布布扣,bubuko.com

时间: 2024-08-26 22:28:43

IplImage 与 CBitmap类 的相互转换的相关文章

OpenCV中IplImage和Mat间的相互转换

OpenCV中做图像处理经常用到IplImage和Mat间的相互转换. 首先,cv::Mat是opencv2.0中的数据类型:IplImage是opencv1.0中的类型,两种类型并不相同. 1. IplImage -> cv::MatIplImage* pImg = cvLoadImage("lena.jpg");cv::Mat img(pImg,0); //第二个参数控制是否复制图像,0是不复制图像,也就是pImg和img的data共用内存,header各自有 2. cv::

泛型 与 实体类的相互转换

问题: 当我强制转换实体类型到泛型的,或者将泛型强制转换为实体类型,会提示无法转换. 如下面代码: PersonInfor 为实体类,T为泛型 public int GetPersonMsgW_<T>(ref T pInfo, string imagePath) { //泛型转换为实体类型 object temp = pInfo; PersonInfor pi = (PersonInfor)temp; //实体类型转换为泛型 temp = pi; pInfo = (T)temp; return

简单实体类和xml文件的相互转换

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时

C++自定义类之间的相互转换

实现自定义类的相互转换的例子如下: #include<iostream> #include<cmath> using namespace std; class complex; class polar { public:  polar():rad(0),theta(0){} polar(float r,float t):rad(r),theta(t){} polar(complex c); operator complex(); void print()  {   cout<

CBitmap、HBITMAP、BITMAP相互转换

一:理解 BITMAP是C++中定义的位图结构体 HBITMAP是Windows中使用的位图句柄 CBitmap是MFC封装的位图类 二:相互转换 1.HBITMAP->CBitmap HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); CBitmap bitmap; bitmap.Attach(hBitmap); 实验源码,在(OnPaint函数中添加) CString st

CImage类

https://www.baidu.com/link?url=NUpABnCOzr-DHBL225vaREsRcKSFhI1ejA9I67GNiHhnGNxXlKdkZfc9ghWFu7EnkK8wVa2ockJ8q-D47YF4zuzdzoldA9CxsSzV4kqrSgu&wd=&eqid=c5b9143800018ffc0000000359ba9114 http://blog.csdn.net/shuilan0066/article/details/7080244 前言       

数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)

引入CImage类的原因 原有的CBitmap 类只能处理BMP格式的图片,非常受限.而CImage可以处理JPGE.GIF.BMP.PNG等多种格式图片,扩展了图片处理功能且能与CBitmap 进行转换( 因为所载入的位图句柄都是HBITMAP,所以可相互转换),因此引入CImage类进行图像处理. CImage类简介 CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG.GIF.BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换. CImage提供增强型的

MFC和ATL共享的新类CImage为图像处理提供了许多相应的处理方法

CImage类 我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可 以显示出绝大多数的外部图像文件(BMP.GIF.JPEG等).因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码. 现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了. CImage类概述 CImage是M

cbitmap 获取RGB CBitMap的用法

MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以胜任的.很多人可能会采用一些现成的CDib类进行位图的读取与处理,我觉得必要性不大.因为他们完成的功能差不多. 以下假设定义了数据成员: CBitmap m_bitmap; (1) 位图的读取 void LoadImage(CString fileName) { HBITMAP m_hBitmap;//位图句柄 BITMAP