当前位置:  开发笔记 > 编程语言 > 正文

如何从HBITMAP创建Gdiplus :: Bitmap,保留alpha通道信息?

如何解决《如何从HBITMAP创建Gdiplus::Bitmap,保留alpha通道信息?》经验,为你挑选了2个好方法。

当我使用Bitmap :: FromHBITMAP函数创建新的Gdiplus :: Bitmap时,生成的Bitmap是不透明的 - 没有保留原始HBITMAP的部分透明度.

有没有办法从HBITMAP创建一个带来alpha通道数据的Gdiplus :: Bitmap?



1> 小智..:

我认为工作代码比指令更有用,所以:

#include 
#include 

Gdiplus::Status HBitmapToBitmap( HBITMAP source, Gdiplus::PixelFormat pixel_format, Gdiplus::Bitmap** result_out )
{
  BITMAP source_info = { 0 };
  if( !::GetObject( source, sizeof( source_info ), &source_info ) )
    return Gdiplus::GenericError;

  Gdiplus::Status s;

  std::auto_ptr< Gdiplus::Bitmap > target( new Gdiplus::Bitmap( source_info.bmWidth, source_info.bmHeight, pixel_format ) );
  if( !target.get() )
    return Gdiplus::OutOfMemory;
  if( ( s = target->GetLastStatus() ) != Gdiplus::Ok )
    return s;

  Gdiplus::BitmapData target_info;
  Gdiplus::Rect rect( 0, 0, source_info.bmWidth, source_info.bmHeight );

  s = target->LockBits( &rect, Gdiplus::ImageLockModeWrite, pixel_format, &target_info );
  if( s != Gdiplus::Ok )
    return s;

  if( target_info.Stride != source_info.bmWidthBytes )
    return Gdiplus::InvalidParameter; // pixel_format is wrong!

  CopyMemory( target_info.Scan0, source_info.bmBits, source_info.bmWidthBytes * source_info.bmHeight );

  s = target->UnlockBits( &target_info );
  if( s != Gdiplus::Ok )
    return s;

  *result_out = target.release();

  return Gdiplus::Ok;
}



2> mackenir..:

事实证明,当从HBITMAP创建位图时,GDI +从不会带来alpha通道.

答案是:

使用在BITMAP和HBITMAP中传递的GetObject来获取输入HBITMAP的宽度和高度(以及输入位图是DIB,像素数据).

使用32位PARGB像素格式创建正确大小的位图.

使用LockBits来获取新Bitmap的pixelData内存.

如果从GetObject获取像素,请使用memcpy复制ARGB值.

在新位图上调用UnlockBits.

在我的例子中,输入HBITMAP的格式对于从输入位图像素数据到新的位图像素数据执行直接memcpy是正确的.

如果您没有从GetObject获取输入像素数据,请使用GetDIBits以正确的格式获取副本.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有