Как нарисовать растровое изображение ARGB с помощью GDI+?
У меня есть действительный дескриптор HBITMAP типа ARGB. Как нарисовать его с помощью GDI+?
Я пробовал метод: graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0); Но он не использует альфа-канал.
4 ответа
У меня есть рабочий образец:
// 1. Получить информацию, используя дескриптор растрового изображения: размер изображения, битыBITMAP bmpInfo;
::GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
int cxBitmap = bmpInfo.bmWidth;
int cyBitmap = bmpInfo.bmHeight;
void* bits = bmpInfo.bmBits;
// 2. Создаем и рисуем новое растровое изображение GDI+, используя биты с пиксельным форматом PixelFormat32bppARGBGdiplus::Graphics graphics(dcMemory);
Gdiplus::Bitmap bitmap(cxBitmap, cyBitmap, cxBitmap*4, PixelFormat32bppARGB, (BYTE*)bits);
graphics.DrawImage(&bitmap, 0, 0);
.NET предлагает статический Image.FromHbitmap
метод. Затем вы можете использовать это изображение и вызвать DrawImage
на цель Graphics
объект.
У меня были похожие проблемы с работой моего прозрачного канала. В моем случае я знал, какой цвет фона следует использовать для прозрачной области (он был сплошным). Я использовал метод Bitmap.GetHBITMAP(..) и передал цвет фона, который будет использоваться для прозрачной области. Это было гораздо более простое решение, чем другие попытки, которые я пытался использовать с помощью LockBits и воссоздать Bitmap с PixelFormat32bppARGB, а также клонировать. В моем случае растровое изображение игнорировало альфа-канал, поскольку оно было создано из Bitmap.FromStream.
У меня также были некоторые очень странные проблемы с незначительным изменением фоновой области моего изображения. Например, вместо чистого белого он был не совсем белого, как 0xfff7f7. Это имело место, использовал ли я JPG (со смешанными цветами) или с PNG и прозрачными цветами.
Смотрите мой вопрос и решение на
Ах... но.Net не использует HBITMAP, а GDI + - это библиотека C++ поверх базового GDI Windows, поэтому я предполагаю, что вы используете не-.Net C++.
GDI + имеет класс Bitmap, который имеет метод FromHBITMAP().
Если у вас есть экземпляр GDI + Bitmap, вы можете использовать его с библиотекой GDI +.
Конечно, если вы можете написать свою программу на C# с использованием.Net, это будет намного проще.