我在 C# 中创建了如下所示的位图(例如):
Image image = Image.FromFile("xxx.png");
Bitmap bitmap = new(image.Width, image.Height, PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.DrawImage(image, 0, 0, image.Width, image.Height);
现在我需要将此位图传递给 C++,我遇到了问题。
我尝试编写一个转换函数,例如:
Gdiplus::Bitmap* Utils::BitmapConverter::Convert(Drawing::Bitmap^ managedBitmap)
{
IntPtr hBitmap = managedBitmap->GetHbitmap();
return Gdiplus::Bitmap::FromHBITMAP((HBITMAP)hBitmap.ToPointer(), NULL);
}
但它不能完美工作:诸如 alpha 通道之类的东西会丢失。
我应该在转换函数中实际更改什么?
确保位图是使用 PixelFormat.Format32bppArgb (支持 Alpha 通道)创建的。 尝试使用 GetHbitmap(Color::Transparent) 在制作 HBITMAP 时保留 alpha 通道(不要忘记删除 HBITMAP 句柄以防止内存泄漏)。
此外,根据将位图从 C# 传递到 C++ 的方式(例如通过 PInvoke 或 COM),您可能需要额外的步骤才能正确传输位图。也就是说,假设您已经设置了互操作方法。