文档章节

Bitmap与IplImage之间的转换

simpower
 simpower
发布于 2017/06/05 09:33
字数 620
阅读 83
收藏 0
  • //Karl_bmp.h
  • //1.IplImage 2 CBitmap
  • CBitmap * IplImage2CBitmap(const IplImage *pImage)
  • {
  •     if( pImage && pImage->depth == IPL_DEPTH_8U )
  •     {
  •         HDC hDC=GetDC()->GetSafeHdc();
  •        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;
  •        }
  •     }
  • }
  •  
  • //2.CBitmap 2 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;
  • }
  •  
  • //3.HBITMAP 2 IplImage
  • IplImage* hBitmap2Ipl(HBITMAP hBmp)
  • {
  •     BITMAP bmp; 
  • ::GetObject(hBmp,sizeof(BITMAP),&bmp);//hBmp-->bmp
  • int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;
  • int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U; 
  • IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight),depth,nChannels); //cvCreateImageHeader
  • //pBuffer = (char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
  •     memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
  • IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,3);
  • cvCvtColor(img,dst,CV_BGRA2BGR);
  • cvReleaseImage(&img);
  • return dst;
  • }
  • //4.IplImage 2 HBITMAP
  • HBITMAP  IplImage2hBitmap(IplImage* pImg)
  • {
  • BYTE tmp[sizeof(BITMAPINFO)+1024];
  • BITMAPINFO *bmi = (BITMAPINFO*)tmp;
  • HBITMAP hBmp;
  • int i;
  • memset(bmi,0,sizeof(BITMAPINFO));
  • bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  • bmi->bmiHeader.biWidth = pImg->width;
  • bmi->bmiHeader.biHeight = pImg->height; 
  • bmi->bmiHeader.biPlanes = 1;
  • bmi->bmiHeader.biBitCount = pImg->nChannels * pImg->depth;
  • bmi->bmiHeader.biCompression = BI_RGB;
  • bmi->bmiHeader.biSizeImage = 0;//if biCompression is BI_RGB,this can be 0
  • bmi->bmiHeader.biClrImportant =0 ;
  • switch(pImg->nChannels * pImg->depth) 
  • case 8 : 
  • for(i=0 ; i < 256 ; i++){ 
  • bmi->bmiColors[i].rgbBlue = i;
  • bmi->bmiColors[i].rgbGreen= i;
  • bmi->bmiColors[i].rgbRed= i;
  • }
  • break;
  • case 32:
  • case 24: 
  • ((DWORD*) bmi->bmiColors)[0] = 0x00FF0000;
  • ((DWORD*) bmi->bmiColors)[1] = 0x0000FF00;
  • ((DWORD*) bmi->bmiColors)[2] = 0x000000FF;
  • break; 
  • hBmp = ::CreateDIBSection(NULL,bmi,DIB_RGB_COLORS,NULL,0,0);
  • SetDIBits(NULL,hBmp,0,pImg->height,pImg->imageData,bmi,DIB_RGB_COLORS);
  • return hBmp;
  • }
  • //5.HBITMAP 2  CBitmap
  • CBitmap HBITMAP2CBitmap(HBITMAP  hbitmap)
  • {
  • CBitmap   cbitmap;
  • cbitmap.Attach(hbitmap);
  • return cbitmap;
  • }
  • 6.CBitmap 2 HBITMAP
  • HBITMAP  CBitmap2HBITMAP(CBitmap bitmap )
  • {
  • HBITMAP bmp = HBITMAP(bitmap);
  • //bmp=(HBITMAP)bitmap.GetSafeHandle();
  • return bmp;
  • }
  • //7.BITMAP 2 CBitmap
  • CBitmap BITMAP2CBitmap(BITMAP   bmp)
  • {
  • CBitmap bitmap;
  • bitmap.GetBitmap(&bmp);
  • return bitmap;
  • }
  • //8.HBITMAP 2 BITMAP 
  • BITMAP HBITMAP2BITMAP(HBITMAP hBmp)
  • {
  • BITMAP bmp; 
  • ::GetObject(hBmp,sizeof(BITMAP),&bmp);//
  • return bmp;
  • }
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Bitmap转为iplimage代码 复制代码 收藏代码

  1. IplImage* BitmapToIplImage(HBITMAP hBmp)   
  2. {   
  3.     BITMAP bmp;       
  4.        
  5.     GetObject(hBmp, sizeof(BITMAP), &bmp);   
  6.     int depth     = (bmp.bmBitsPixel == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;   
  7.     int nChannels = (bmp.bmBitsPixel == 1) ? 1 : bmp.bmBitsPixel/8;       
  8.        
  9.     IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight), depth, nChannels);     
  10.        
  11.     BYTE *pBuffer = new BYTE[bmp.bmHeight*bmp.bmWidth*nChannels];       
  12.     GetBitmapBits(hBmp, bmp.bmHeight*bmp.bmWidth*nChannels, pBuffer);   
  13.     memcpy(img->imageData, pBuffer, bmp.bmHeight*bmp.bmWidth*nChannels);      
  14.     delete pBuffer;   
  15.   
  16.     IplImage *dst = cvCreateImage(cvGetSize(img), img->depth,3);       
  17.     cvCvtColor(img, dst, CV_BGRA2BGR);      
  18.     cvReleaseImage(&img);      
  19.     return dst;   
  20. }  

 如果要从CBitmap转为IplImage,可以先将CBitmap转为BITMAP,再由BITMAP转为IplImage;

Cbitmap 转为 bitmap代码 复制代码 收藏代码

  1. // CBitmap 转为 BITMAP   
  2. CBitmap bitmap;   
  3. bitmap.LoadBitmap(IDB_BITMAP);   
  4. BITMAP   bmp;   
  5. bitmap.GetBitmap(&bmp);   
  6.   
  7. // CBitmap与HBITMAP间的转换   
  8. // CBitmap转为HBITMAP   
  9. CBitmap bitmap;   
  10. bitmap.LoadBitmap(IDB_BITMAP);   
  11. HBITMAP bmp = HBITMAP(bitmap);   
  12. // HBITMAP转为CBitmap   
  13. HBITMAP  hbitmap;     
  14. CBitmap   bitmap;   
  15. bitmap.Attach(hbitmap);  

本文转载自:http://blog.sina.com.cn/s/blog_77ed43e301016ha3.html

simpower
粉丝 28
博文 669
码字总数 50544
作品 0
海淀
程序员
私信 提问
OpenCV用GDI或者GDI+函数对IplImage图像处理

(1 )IplImage -> Bitmap and Bitmap -> IplImage IplImage *img ;Bitmap bitmap( 20 ,20 ,PixelFormat24bppRGB ) ;Graphics pGra( & bitmap) ;HDC hdc = pGra ->GetHDC() ;CvImage cvimg ;cv......

moki_oschina
2016/04/09
92
0
OpenCv中cv::Mat和IplImage,CvMat之间的转换

(1)将IplImage类型转换到Mat类型 [cpp] view plain copy print? Mat::Mat(const IplImage* img, bool copyData=false); Mat::Mat(const IplImage* img, bool copyData=false); 默认情况下,......

moki_oschina
2016/04/09
114
0
opencv中的图像格式转换

目录 前言 在中,对应保存图像的结构体,从到,再到,保存图像的结构体常见的有和。这里记录一下它们之间的转换方法。 之前的转换方法 参考CvMat、Mat、IplImage之间的转换详解及实例 这里只...

simonforfuture
2017/12/15
0
0
UIImage与Iplimage相互转换

UIImage与Iplimage相互转换 作者: 知识天地 来源: 博客园 发布时间:2012-02-27 15:43 阅读:48 次 原文链接 [收藏] 原创文章,转载请注明出处:http://www.cnblogs.com/mfryf/archive/20...

晨曦之光
2012/05/28
525
0
opencv中的几种常见的图像数据类型

1 opencv中的几种常见的图像类型 opencv中,几种常见的图像类型有: IplImage,Mat,CvMat,CvArr CvArr : 老版本的结构了。是一个抽象基类,在函数原型中,常见到CvArr(CvArr),这就允许...

xiaot99
2014/04/11
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部