У меня есть действительный дескриптор HBITMAP типа ARGB. Как нарисовать его с помощью GDI+?
Я пробовал метод: graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0); Но он не использует альфа-канал.
У меня есть действительный дескриптор HBITMAP типа ARGB. Как нарисовать его с помощью GDI+?
Я пробовал метод: graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0); Но он не использует альфа-канал.
У меня есть рабочий образец:
// 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
.
Ах... но .Net не использует HBITMAP, а GDI+ - это библиотека C++ поверх базового Windows GDI, поэтому я предполагаю, что вы используете не-.Net C++.
В GDI+ есть класс Bitmap с методом FromHBITMAP().
Если у вас есть экземпляр GDI+ Bitmap, вы можете использовать его с библиотекой GDI+.
Конечно, если вы можете написать свою программу на C#, используя .Net, это будет намного проще.
У меня были похожие проблемы с работой моего прозрачного канала. В моем случае я знал, какой цвет фона следует использовать для прозрачной области (он был сплошным). Я использовал метод Bitmap.GetHBITMAP(..) и передал цвет фона, который будет использоваться для прозрачной области. Это было гораздо более простое решение, чем другие попытки, которые я пытался использовать с помощью LockBits и воссоздания растрового изображения с помощью PixelFormat32bppARGB, а также клонирования. В моем случае Bitmap игнорировал альфа-канал, поскольку он был создан из Bitmap.FromStream.
У меня также были очень странные проблемы с небольшим изменением фоновой области моего изображения. Например, вместо чисто белого он был не совсем белым, как 0xfff7f7. Это было в том случае, если я использовал JPG (со смешанными цветами) или PNG и прозрачные цвета.
Смотрите мой вопрос и решение на
GDI+ DrawImage файла JPG с белым фоном не белый