Domanda

Sto provando a bitblt da un hbitmap a un bitmap GDI+. Ho provato questo, ma non succede nulla:

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

MODIFICARE: Apparentemente l'HDC non funziona se lo acquisisco e poi molto più tardi lo uso con Bitblt. Avevo bisogno di assicurarmi che l'HDC fosse ancora valido. Questa è la soluzione:

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

Qualcuno sa perché questo cambiamento è necessario? Perché non potrebbe funzionare usare un HDC che è stato ottenuto in precedenza come nel primo esempio?

È stato utile?

Soluzione

Controlla il campione alla fine di questo pagina su pinvoke.net. Le chiamate aggiuntive a CreateCompatibledc e SelectObject potrebbero far funzionare il campione.

In alternativa, puoi prendere in considerazione l'utilizzo di graphics.DrawimageUnScald che ti consentirebbe di implementare il tuo codice solo sul lato .NET e offrirebbe comunque una prestazione abbastanza buona.

Aggiornare (A causa della domanda aggiornata)
Non so esattamente perché l'HDC diventa non valido dopo un po ', ma secondo Msdn Chiami GETHDC e ReleaseHDC in coppia e raggruppano le chiamate al codice GDI+ tra di loro: "Le chiamate ai metodi GETHDC e ReleaseHDC devono apparire in coppia. Durante l'ambito di una coppia di metodi GETHDC e ReleaseHDC, di solito si effettua solo chiamate alle funzioni GDI. "

Quindi, secondo la documentazione, il modo in cui hai fatto nel tuo secondo campione è la strada da percorrere e non dovresti memorizzare nella cache e riutilizzare i valori dal metodo GETHDC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top