È possibile BitBlt direttamente su una bitmap GDI+?
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?
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.