Pregunta

Estoy tratando de bitBlt de un HBITMAP a un GDI+ Bitmap. Intenté esto, pero no pasa nada:

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);

EDITAR: Aparentemente, el HDC no funciona si lo adquiero y luego mucho más tarde lo uso con BitBlt. Necesitaba asegurarme de que el HDC aún fuera válido. Esta es la solución:

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);

¿Alguien sabe por qué este cambio es necesario? ¿Por qué no podría funcionar usar un HDC que se haya hecho antes como en el primer ejemplo?

¿Fue útil?

Solución

Verifique la muestra al final de esto página en pinvoke.net. Las llamadas adicionales a CreateCompatIBLEDC y SelectObject pueden hacer que su muestra funcione.

Alternativamente, puede considerar usar gráficos. PrawImageUnscalled, lo que le permitiría implementar su código solo en el lado de .NET y aún ofrecería un rendimiento bastante bueno.

Actualizar (Debido a la pregunta actualizada)
No sé exactamente por qué el HDC se vuelve inválido después de un tiempo, pero según MSDN Llamas a GETHDC y ReleaseHDC en pares y agrupa las llamadas al código GDI+ entre ellos: "Las llamadas a los métodos GETHDC y ReleeberHDC deben aparecer en pares. Durante el alcance de un par de métodos GETHDC y ReleaseHDC, generalmente realizan llamadas a las funciones GDI. "

Entonces, según la documentación, la forma en que lo hizo en su segunda muestra es el camino a seguir y no debe almacenar en caché y reutilizar los valores del método GETHDC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top