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);

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

     

  • 相关阅读:
    Codeforces 1265A Beautiful String
    1039 Course List for Student (25)
    1038 Recover the Smallest Number (30)
    1037 Magic Coupon (25)
    1024 Palindromic Number (25)
    1051 Pop Sequence (25)
    1019 General Palindromic Number (20)
    1031 Hello World for U (20)
    1012 The Best Rank (25)
    1011 World Cup Betting (20)
  • 原文地址:https://www.cnblogs.com/meiling/p/1732894.html
Copyright © 2011-2022 走看看