c++ - 如何从 HBITMAP 创建 Gdiplus::Bitmap,保留 alpha channel 信息?

标签 c++ gdi+ bitmap gdi

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

有没有一种方法可以从 HBITMAP 创建一个 Gdiplus::Bitmap 来传递 alpha channel 数据?

最佳答案

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

#include <GdiPlus.h>
#include <memory>

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

关于c++ - 如何从 HBITMAP 创建 Gdiplus::Bitmap,保留 alpha channel 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/335273/

相关文章:

java - Android 上的渐进式图像加载

来自相机的 android 位图只是缩略图大小?

android.hardware.Camera$EventHandler.handleMessage

c++ - 为什么 MSVC 在覆盖具有正确签名的函数时会产生 C3668 错误?

c++ - 有没有办法向上转换成一个抽象类并且每次从它派生一个类时都不修改它?

c++ - 未定义的静态类变量

c++ - 从 Python 输出数组值然后通过 C++ 接收它们的好方法?

c# - 如何读取屏幕像素的颜色

c# - 是否可以访问图形路径中的点?

c++ - 如何使用 GDI+ 库解码内存中的 jpeg?