Как нарисовать растровое изображение ARGB с помощью GDI +? - PullRequest
4 голосов
/ 08 октября 2008

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

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

Ответы [ 4 ]

7 голосов
/ 08 октября 2008

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

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

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

0 голосов
/ 05 января 2011

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

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

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

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

0 голосов
/ 08 октября 2008

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

GDI + имеет класс Bitmap, который имеет метод FromHBITMAP ().

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

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

0 голосов
/ 08 октября 2008

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

...