Pod Win32, jest powszechną techniką w celu wygenerowania bitową monochromatyczny z bitmapy do celów przejrzystości, wykonując następujące czynności:Jak genrate maskę monochromatyczny bitową bitmapę 32bit
SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));
ta zakłada, że hdcSource jest pamięć DC trzymającą obraz źródłowy, a hdcMask jest pamięcią DC z pamięcią trzymającą monochromatyczną bitmapę o tym samym rozmiarze (więc oba mają rozmiar 32x32, ale źródło ma kolor 4-bitowy, natomiast cel jest monochromatyczny 1-bitowy).
Jednak wydaje mi się, że to nie działa, gdy źródło ma kolor 32-bitowy i alfa. Zamiast uzyskać monochromatyczną bitmapę w hdcMask, dostaję maskę, która jest cała czarna. Żadne bity nie są ustawione na biały (1). Podczas gdy działa to dla źródła koloru 4bit.
Moje wyszukiwanie-foo zawodzi, ponieważ nie mogę znaleźć żadnych odniesień do tego konkretnego problemu.
Wyizolowałem, że jest to rzeczywiście problem w moim kodzie: tzn. Jeśli używam mapy bitowej źródła, która ma 16 kolorów (4bit), działa; jeśli użyję obrazu 32-bitowego, generuje on całkowicie czarną maskę.
Czy istnieje alternatywna metoda, której powinienem używać w przypadku 32-bitowych kolorowych obrazów? Czy istnieje problem z kanałem alfa, który przesłania normalne zachowanie powyższej techniki?
Dziękujemy za każdą pomoc, którą możesz zaoferować!
ADDENDUM: Nadal nie mogę znaleźć techniki, która tworzy poprawną monochromatyczną mapę bitową dla mojej mapy bitowej źródła generowanej przez GDI +.
W pewien sposób złagodziłem mój konkretny problem, po prostu nie generując monochromatycznej maski bitowej, a zamiast tego używam TransparentBlt(), która wydaje się dobrze to robić (ale nie wiem, co robią wewnętrznie to wszystko, co pozwala im prawidłowo zamaskować obraz).
To może być przydatne, aby mieć naprawdę dobry, funkcję roboczą:
HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
gdzie zawsze tworzy prawidłową maskę przezroczystości, niezależnie od głębokości koloru hSource.
Pomysły?
GDI utknął na 24bpp. TransparentBlt() jest nieco nietypowy, udokumentowany jest do obsługi 32bpp. Czas na przejście do GDI + być może. –