Please help me con canale alfa in HDC. Rendo HDC dc throw CreateCompatibleDC. Quindi chiama CreateDIBSection e può trovare i byte di immagine in memoria. Quindi chiama DrawFrameControl a questo dc. Tutto funziona, ma in memoria ci sono 4 byte per pixel e il canale alfa si riempie per 00. Anche se prima c'erano FF. Ma ho bisogno di un canale alfa. Come posso rendere DrawFrameControl impostato valori alfa reali o semplicemente non li tocco. Grazie. E scusa per il pessimo inglese :(Canale alfa in DeviceContext (HDC)
risposta
Non è possibile fare in modo che GDI non scriva sul byte alfa/riservato di una bitmap a quattro byte per pixel GDI non è realmente alfa-aware, con l'eccezione di un paio di funzioni come AlphaBlend
. Tuttavia, è possibile utilizzare la conoscenza che si scrive e reimposta l'alfa a 0 sapere quali pixel ha scritto a, e correggere manualmente l'alfa dopo.
per ulteriori informazioni, leggere questi tre articoli:
- Transparent Graphics with GDI, Part 1
- Transparent Graphics with GDI, Part 1 1/2
- Transparent Graphics with GDI, Part 2
I primi due probabilmente vi darà informazioni sufficienti per ottenere quello che vuoi.
Questi articoli adottano un approccio generico alla gestione di alfa con le funzioni GDI, eseguendo la scansione di pixel in cui l'alfa è stato danneggiato e risolvendolo (e utilizza tecniche più avanzate per disegnare più elementi uno sopra l'altro, con un'alfa corretta.) FrameRect
disegna un rettangolo in cui le linee sono di un'unità larga e alta. Potresti trovare più efficiente disegnare usando le linee, o anche modificare direttamente la bitmap dei pixel in memoria, per disegnare linee rette in memoria. Ciò evita di dover scansionare l'intera bitmap per i pixel disegnati da GDI - dopo tutto, dato che si tratta di un rettangolo con bordi a una unità, sai esattamente quali pixel verranno disegnati e puoi modificarli tu stesso.