In Win32, è una tecnica comune per generare una maschera di bit in bianco e nero da una bitmap per l'utilizzo di trasparenza nel modo seguente:Come genrate una maschera di bit in bianco e nero per una bitmap a 32 bit
SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));
Questo presuppone che hdcSource è una memoria DC contenente l'immagine sorgente e hdcMask è una memoria DC che contiene una bitmap monocromatica della stessa dimensione (quindi entrambi sono 32x32, ma la sorgente è a 4 bit, mentre la destinazione è monocromatica 1 bit).
Tuttavia, questo sembra non funzionare quando l'origine è a 32 bit colore + alfa. Invece di ottenere una bitmap monocromatica in hdcMask, ottengo una maschera completamente nera. Nessun bit viene impostato su bianco (1). Mentre questo funziona per la fonte di colori a 4 bit.
La mia ricerca-foo non funziona, in quanto non riesco a trovare alcun riferimento a questo particolare problema.
Ho isolato che questo è davvero il problema nel mio codice: ad esempio se utilizzo una bitmap di origine che è a 16 colori (4 bit), funziona; se uso un'immagine a 32 bit, produce la maschera completamente nera.
C'è un metodo alternativo che dovrei usare nel caso di immagini a 32 bit a colori? C'è un problema con il canale alfa che sovrascrive il normale comportamento della tecnica sopra?
Grazie per l'aiuto che potresti avere da offrire!
ADDENDUM: Non riesco ancora a trovare una tecnica che crei una bitmap monocromatica valida per la mia bitmap sorgente prodotta GDI +.
Ho in qualche modo alleviato il mio particolare problema semplicemente non generando un bitmask monocromatico, e invece sto usando TransparentBlt(), che sembra averlo corretto (ma non so cosa stiano facendo internamente è diverso che consente loro di mascherare correttamente l'immagine).
Potrebbe essere utile avere una buona, la funzione di lavoro:
HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
Dove si crea sempre una maschera di trasparenza valida, a prescindere dalla profondità di colore di hSource.
Idee?
GDI è bloccato a 24bpp. TransparentBlt() è un po 'insolito, è documentato per supportare 32bpp. È ora di passare a GDI +, forse. –