Как нарисовать растровое изображение ARGB с помощью GDI+?

У меня есть действительный дескриптор HBITMAP типа ARGB. Как нарисовать его с помощью GDI+?

Я пробовал метод: graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0); Но он не использует альфа-канал.


person Community    schedule 08.10.2008    source источник


Ответы (4)


У меня есть рабочий образец:

// 1. Получить информацию с помощью дескриптора растрового изображения: размер изображения, биты
BITMAP bmpInfo;
::GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
int cxBitmap = bmpInfo.bmWidth;
int cyBitmap = bmpInfo.bmHeight;
void* bits = bmpInfo.bmBits;

// 2. Создайте и нарисуйте новое растровое изображение GDI+, используя биты с пиксельным форматом PixelFormat32bppARGB
Gdiplus::Graphics graphics(dcMemory);
Gdiplus::Bitmap bitmap(cxBitmap, cyBitmap, cxBitmap*4, PixelFormat32bppARGB, (BYTE*)bits);
graphics.DrawImage(&bitmap, 0, 0);

person Community    schedule 08.10.2008

.NET предлагает статический метод Image.FromHbitmap. Затем вы можете использовать это изображение и вызвать DrawImage для целевого объекта Graphics.

person Konrad Rudolph    schedule 08.10.2008
comment
Этот метод не рисует прозрачный цвет. Вот вопрос. Как уведомить Gdi+, что я хочу рисовать именно растровое изображение ARGB? - person ; 08.10.2008
comment
Объект GDI+ Bitmap имеет конструктор, который принимает ширину, высоту и формат пикселей в качестве параметров. После создания растровое изображение будет иметь желаемую разрядность и включать альфа-канал, если требуется. - person Jeff B; 08.10.2008

Ах... но .Net не использует HBITMAP, а GDI+ - это библиотека C++ поверх базового Windows GDI, поэтому я предполагаю, что вы используете не-.Net C++.

В GDI+ есть класс Bitmap с методом FromHBITMAP().

Если у вас есть экземпляр GDI+ Bitmap, вы можете использовать его с библиотекой GDI+.

Конечно, если вы можете написать свою программу на C#, используя .Net, это будет намного проще.

person Jeff B    schedule 08.10.2008

У меня были похожие проблемы с работой моего прозрачного канала. В моем случае я знал, какой цвет фона следует использовать для прозрачной области (он был сплошным). Я использовал метод Bitmap.GetHBITMAP(..) и передал цвет фона, который будет использоваться для прозрачной области. Это было гораздо более простое решение, чем другие попытки, которые я пытался использовать с помощью LockBits и воссоздания растрового изображения с помощью PixelFormat32bppARGB, а также клонирования. В моем случае Bitmap игнорировал альфа-канал, поскольку он был создан из Bitmap.FromStream.

У меня также были очень странные проблемы с небольшим изменением фоновой области моего изображения. Например, вместо чисто белого он был не совсем белым, как 0xfff7f7. Это было в том случае, если я использовал JPG (со смешанными цветами) или PNG и прозрачные цвета.

Смотрите мой вопрос и решение на

GDI+ DrawImage файла JPG с белым фоном не белый

person Ron    schedule 05.01.2011