zoukankan      html  css  js  c++  java
  • IplImage和 CBitmap转化

    程序 2009-12-17 11:17:52 阅读89 评论0 字号:

    在写mfc程序时如果用到opencv,肯定会用到这两个之间的转化。在网上找了好多,几乎都一样,我的情况稍微特殊,找了半天也没合适的,MD,一气之下,自己跟踪进去CvvImage::DrawToHDC,

    void IplImage2CBitmap(Iplimage* ipg_src)

    {
     CBitmap* m_pBitmap=new CBitmap;

     if (ipg_src->depth==IPL_DEPTH_8U)
     {
      uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
            BITMAPINFO* bmi = (BITMAPINFO*)buffer;
            int bmp_w = ipg_src->width, bmp_h = ipg_src->height;
      
            //FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), pImage->origin );
      int width=bmp_w;
      int height=bmp_h;
      int bpp=ipg_src ? (ipg_src->depth & 255)*ipg_src->nChannels : 0;
      int origin=ipg_src->origin;
      HBITMAP hBitmap;
      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;
       }
      }

    }
    以上代码改装自opencv。到了这个时候就可以

    HBITMAP hbmp=CreateDIBitmap(pdc->GetSafeHdc(),bmih,CBM_INIT,ipg_src->imageData,bmi,DIB_RGB_COLORS);

    这里千万万千要注意的是第一个参数,一定是要将图片显示的设备的句柄,null表示内存。

    最后:m_pBitmap->Attach(hBitmap);完事大吉,当然如果加一个

      if(m_pBitmap->m_hObject!=NULL)
      {
       m_pBitmap->Detach();
      }更好

    opencv里面是用的是 ::StretchDIBits(设备句柄,……),如果用pdc->StretchBlt()的话是无法显示的,至于为什么,由于水平有限!

    网上的只是参考,一定要有自己的思考。写一些自己理解的转化,虽然也是抄的,但加了自己的东西。

    CBitmap m_bitmap;

    HBITMAP h_bmp;

    h_bmp=m_bitmap.m_hObject;   CBitmap ==>HBITMAP 

    m_bitmap=CBitmap::FromHandle(h_bmp);     HBITMAP==>CBitmap

    我曾试着把IplImage直接转化为CBitmap就是用网上的这段代码,可在显示的时候却没成功,也不知道转化是否成功。下面是代码

    IplImage ->CBitmap , Cbitmap ->IplImage
    CDC *pdc = this ->GetDC() ;
    IplImage *img = cvCreateImage( cvSize( 100,100 ) , 8 , 3 );
    CBitmap m_bitmap ;
    m_bitmap.CreateCompatibleBitmap( pdc , 100 ,100 ) ;
    CDC memdc ;
    memdc.CreateCompatibleDC( pdc ) ;
    CBitmap *pold = memdc .SelectObject( &m_bitmap) ;
    CvvImage cvimg ;
    Rect rect(0 , 0 , 100,100 ) ;
    cvimg.CopyOf( img , -1 ) ;
    cvimg.DrawToHDC( memdc.m_hDC , &rect ) ;
    ReleaseDC( pdc) ;
    IplImage *tempimg = cvCloneImage( img ) ;
    m_bitmap.GetBitmapBits( img ->widthStep * img ->height , img ->imageData) ;

    我曾试着把m_bitmap显示出来以验证是否转化成功,用了这样的函数

    memdc.StretchBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,w,h,SRCCOPY);

    可是没有奏效!至今还不明!

     

  • 相关阅读:
    【转】 mysql反引号的使用(防冲突)
    【百度一键分享功能】百度一键分享插件
    【WEB2.0】 网页调用QQ聊天(PC+M站)
    python : takes 0 positional arguments but 1 was given
    python : 设计模式之外观模式(Facade Pattern)
    Tosca : 扩展dll动态语言 识别点击下拉, 识别成table
    Tosca : 把 inner text 放到变量里,定义变量,使用变量
    Tosca:键盘输入字符串
    Tosca 给定义变量,取内容放到变量里
    Tosca :配置环境参数
  • 原文地址:https://www.cnblogs.com/meiling/p/1732894.html
Copyright © 2011-2022 走看看