2012-04-12 10 views
6

Pomóż mi z kanałem alfa w HDC. Robię HDC dc throw CreateCompatibleDC. Następnie wywołaj funkcję CreateDIBSection i znajdź bajty obrazu w pamięci. Następnie wywołaj DrawFrameControl do tego dc. Wszystkie prace, ale w pamięci są 4 bajty na piksel i kanał alfa wypełnia się o 00. Nawet jeśli wcześniej były FF. Ale potrzebuję kanału alfa. W jaki sposób ustawić DrawFrameControl na prawdziwe wartości alfa lub po prostu ich nie dotykać. Dziękuję Ci. I przepraszam za zły angielski :(Kanał alfa w DeviceContext (HDC)

Odpowiedz

7

Nie można sprawić, by GDI nie zapisywał się do alfa/bajtu zarezerwowanego w bitmapie czterobajtowym na piksel. GDI nie jest tak naprawdę alfa świadomy, z wyjątkiem pary z funkcjami takimi jak AlphaBlend. można jednak wykorzystać wiedzę, że pisze go i resetuje alfa 0 wiedzieć, które piksele to pisał do i ręcznie naprawić alfa później.

aby uzyskać więcej informacji, przeczytaj te trzy artykuły:

pierwszych dwóch prawdopodobnie daje wystarczająco dużo informacji, aby osiągnąć to, co chcesz.

Artykuły te stosują ogólne podejście do obsługi alfy z funkcjami GDI, skanując piksele, w których alfa została zbita i naprawia (i przechodzi do bardziej zaawansowanych technik rysowania kilku rzeczy jeden na drugim, z poprawną alfą.) FrameRect rysuje prostokąt, w którym linie mają szerokość jednej jednostki i są wysokie. Możesz wydajniej rysować za pomocą linii, a nawet bezpośrednio edytować bitmapę pikselową w pamięci, aby narysować proste linie w pamięci. Dzięki temu nie trzeba przeskanować całej mapy bitowej dla pikseli narysowanych za pomocą GDI - w końcu, ponieważ jest to prostokąt z szerokimi krawędziami jednego urządzenia, wiesz dokładnie, które piksele będą już rysowane i możesz je edytować samodzielnie.