Возможно ли BitBlt непосредственно на растровое изображение GDI +? - PullRequest
0 голосов
/ 01 января 2011

Я пытаюсь выполнить BitBlt из HBITMAP в GDI + растровое изображение.Я попробовал это, но ничего не происходит:

Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);
IntPtr hBufferDC = BufferGraphics.GetHdc();

...

BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);

РЕДАКТИРОВАТЬ: Очевидно, что hDC не работает, если я его получу, а затем гораздо позже использую его с BitBlt.Мне нужно было убедиться, что hDC все еще действителен.Вот решение:

Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);

...

IntPtr hBufferDC = BufferGraphics.GetHdc();
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);
BufferGraphics.ReleaseHdc(hBufferDC);

Кто-нибудь знает, почему это изменение необходимо?Почему может не работать использование hDC, полученного ранее, как в первом примере?

1 Ответ

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

Проверьте образец в конце этой страницы на pinvoke.net. Дополнительные вызовы CreateCompatibleDC и SelectObject могут заставить ваш пример работать.

В качестве альтернативы, вы можете рассмотреть возможность использования Graphics.DrawImageUnscalled, который позволит вам реализовать ваш код только на стороне .Net и все равно будет предлагать довольно хорошую производительность.

Обновление (В связи с обновленным вопросом)
Я не знаю точно, почему через некоторое время hDC становится недействительным, но согласно MSDN вы вызываете пары GetHdc и ReleaseHdc и группируете вызовы кода GDI + между ними: «Вызовы методов GetHdc и ReleaseHdc должны появляться в парах. Во время действия пары методов GetHdc и ReleaseHdc вы обычно делаете только вызовы функций GDI. "

Итак, согласно документации, путь, который вы сделали во втором примере, - это путь, и вы не должны кэшировать и повторно использовать значения из метода GetHdc.

...