当我使用Bitmap :: FromHBITMAP函数创建一个新的Gdiplus :: Bitmap时, 生成的Bitmap是不透明的 - 没有保留原始HBITMAP的部分透明度。
有没有办法从HBITMAP创建一个带来alpha通道数据的Gdiplus :: Bitmap?
答案 0 :(得分:11)
我认为工作代码比说明更有用,所以:
#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;
}
答案 1 :(得分:5)
事实证明,当从HBITMAP创建位图时,GDI +永远不会带来alpha通道。
答案是:
在我的例子中,输入HBITMAP的格式对于从输入位图像素数据到新的位图像素数据执行直接memcpy是正确的。
如果您没有从GetObject获取输入像素数据,请使用GetDIBits以正确的格式获取副本。