HBITMAP转化为Bitmap(使用GDI+保存带Alpha通道的图像)

Bitmap *  ImageUtil :: CreateBitmapFromHBITMAP ( IN   HBITMAP   hBitmap ) 

     BITMAP   bmp  = { 0 }; 
     if  ( 0 ==  GetObject ( hBitmap ,  sizeof ( BITMAP ), ( LPVOID )& bmp ) ) 
    { 
         return   FALSE ; 
    } 
     // Although we can get bitmap data address by bmp.bmBits member of BITMAP  
     // which is got by GetObject function sometime, 
     // we can determine the bitmap data in the HBITMAP is arranged bottom-up  
     // or top-down, so we should always use GetDIBits to get bitmap data. 
     BYTE  * piexlsSrc  =  NULL ; 
     LONG   cbSize  =  bmp . bmWidthBytes  *  bmp . bmHeight ; 
     piexlsSrc  =  new   BYTE [ cbSize ]; 
     BITMAPINFO   bmpInfo  = { 0 }; 
     // We should initialize the first six members of BITMAPINFOHEADER structure. 
     // A bottom-up DIB is specified by setting the height to a positive number,  
     // while a top-down DIB is specified by setting the height to a negative number. 
     bmpInfo . bmiHeader . biSize  =  sizeof ( BITMAPINFOHEADER ); 
     bmpInfo . bmiHeader . biWidth  =  bmp . bmWidth ; 
     bmpInfo . bmiHeader . biHeight  =  bmp . bmHeight ;  // 正数,说明数据从下到上,如未负数,则从上到下
     bmpInfo . bmiHeader . biPlanes  =  bmp . bmPlanes ; 
     bmpInfo . bmiHeader . biBitCount  =  bmp . bmBitsPixel ; 
     bmpInfo . bmiHeader . biCompression  =  BI_RGB ; 
     HDC   hdcScreen  =  CreateDC ( L "DISPLAY" ,  NULL ,  NULL , NULL ); 
     LONG   cbCopied  =  GetDIBits ( hdcScreen ,  hBitmap , 0,  bmp . bmHeight ,  
         piexlsSrc , & bmpInfo ,  DIB_RGB_COLORS ); 
     DeleteDC ( hdcScreen ); 
     if  ( 0 ==  cbCopied  ) 
    { 
         delete  []  piexlsSrc ; 
         return   FALSE ; 
    } 
     // Create an GDI+ Bitmap has the same dimensions with hbitmap 
     Bitmap  * pBitmap  =  new   Bitmap ( bmp . bmWidth ,  bmp . bmHeight ,  PixelFormat32bppPARGB ); 
     // Access to the Gdiplus::Bitmap's pixel data 
     BitmapData   bitmapData ; 
     Rect   rect (0, 0,  bmp . bmWidth ,  bmp . bmHeight ); 
     if  (  Ok  !=  pBitmap -> LockBits (& rect ,  ImageLockModeRead ,  
         PixelFormat32bppPARGB , & bitmapData ) ) 
    { 
         delete  ( pBitmap ); 
         return   NULL ; 
    } 
     BYTE  * pixelsDest  = ( BYTE *) bitmapData . Scan0 ; 
     int   nLinesize  =  bmp . bmWidth  *  sizeof ( UINT ); 
     int   nHeight  =  bmp . bmHeight ; 
     // Copy pixel data from HBITMAP by bottom-up. 
     for  (  int   y  = 0;  y  <  nHeight ;  y ++ ) 
    { 
         // 从下到上复制数据,因为前面设置高度时是正数。
         memcpy_s (  
            ( pixelsDest  +  y  *  nLinesize ),  
             nLinesize ,  
            ( piexlsSrc  + ( nHeight  -  y  - 1) *  nLinesize ),  
             nLinesize ); 
    } 
     // Copy the data in temporary buffer to pBitmap 
     if  (  Ok  !=  pBitmap -> UnlockBits (& bitmapData ) ) 
    { 
         delete   pBitmap ; 
    } 
     delete  []  piexlsSrc ; 
     return   pBitmap ; 

 

https://www.cnblogs.com/yedaoq/p/3579036.html

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值