2009-08-27 13 views
8

Utworzono bitmapę za pomocą GDI + .Przypisuję tekst do tej bitmapy za pomocą GDI Drawtext.Używanie tekstu kreślonego Nie mogę zastosować przezroczystości. Każda pomoc lub kod zostanie doceniony.Przejrzystość do tekstu w GDI

+1

Preferowany język? C, C++, VB.net, C# ?? –

+0

Preferowany będzie zwykły Windows API/C++ – VideoDev

+1

Czy GDI + to literówka? –

Odpowiedz

13

Jeśli chcesz narysować tekst bez wypełnienia tła, SetBkMode(hdc,TRANSPARENT) powie GDI, aby opuścił tło podczas rysowania tekstu.


Faktyczne renderowanie koloru pierwszego planu tekstu z alfą ... będzie bardziej skomplikowane. GDI tak naprawdę nie obsługuje kanałów alfa w swoich interfejsach API. Na zewnątrz AlphaBlend tak naprawdę wszystko, co robi, to zachowanie kanału. Właściwie nie jest to właściwe, aby ustawić górne bity wartości COLOREF na alfa, ponieważ wysoki bajt jest faktycznie używany dla flag, aby wskazać, czy COLOREF jest (zamiast wartości RGB) wpisem palety.

Tak, niestety, jedynym prawdziwym rozwiązaniem jest:

  1. Tworzenie DIBSection 32bit. (CreateDIBSection). Daje to HBITMAP, który gwarantuje, że będzie w stanie przechowywać informacje alfa. Jeśli utworzysz bitmapę za pomocą jednej z innych funkcji tworzenia bitmapy, będzie ona dostępna na poziomie coludepth urządzenia, które może nie być 32bpp.
  2. Narysuj tekst na DIBSection.
  3. Po utworzeniu DIBSection dostałeś wskaźnik do rzeczywistej pamięci. W tym momencie musisz przejść przez pamięć i ustawić wartości alfa. Nie sądzę, żeby DrawText w ogóle sam zrobił cokolwiek dla kanału alfa. Zamierzam liczyć na proste sprawdzenie komponentów RGB każdego DWORD mapy bitowej - jeśli są one w kolorze forground, przepisać DWORD z 50% (lub cokolwiek) alfa w bajcie alfa, jeśli są one kolorem tła, przepisać z 100% alfa w bajcie alfa. *
  4. AlphaBlend bitmapę na miejsce docelowe. AlphaBlend wymaga wstępnego pomnożenia kanału alfa w źródle.

* może być wystarczające, aby tylko memset z DIBSection z 50% alfa przed wykonaniem drawText i zapewniają, że BKColor czarny. Nie wiem jednak, co może zrobić DrawText do kanału alfa. Wymagane są pewne eksperymenty.

+0

Dziękuję za odpowiedź. Użyłem tej metody. Korzystając z tego, tekst zostanie narysowany w prostokącie tranparently.Ale chcę zastosować przezroczystość (alfa) do tekstu, który nie jest możliwy przy użyciu metody SetTextColor. Ponieważ SetTextColor ignoruje wartość alfa koloru. Przeszedłem przez pewną aplikację, która używa maski bitmapy do zastosowania przezroczystości, ale nie uzyskałem pożądanych rezultatów. i nie chcę stosować przezroczystości do bitmapy, chcę zastosować przezroczystość do tekstu narysowanego na bitmapie. Każda pomoc jest doceniana – VideoDev

+0

Pomysł jest, narysuj na czarnej bitmapie, a nie na bitmapie z informacjami na ten temat. Po zbiciu tekstu możesz zeskanować bitmapę dla pikseli innych niż czarne i dostosować kanał alfa dla każdego piksela na podstawie tego, czy jest to jego część, czy też nie. –

0

Hmmmm - próbując to zrobić tutaj - zastanawiasz się - widzę, że kiedy tworzysz sekcję dib, określasz "maski", które są maską R, G, B (i alfa).

JEŻELI i to jest duże, jeśli tak naprawdę nie zmienia kanału alfa, to możesz określić maskę inaczej dla dwóch nagłówków bitmapowych. ONe określa thr RGB w odpowiednich miejscach, a drugi sprawia, że ​​wszystkie mają przypisane bity do kanału alfa. (w takim przypadku ustaw kolor tekstu na biały), a następnie renderuj w dwóch przebiegach, jeden do ładowania wartości kolorów, drugi do ładowania wartości alfa.

???? tak czy inaczej tylko musing :)

0

Podczas gdy to pytanie jest o półprzezroczystym tekście, miałem przeciwny problem.

DrawText był czyniąc tekst w moim warstwowym oknie (UpdateLayeredWindow) półprzezroczysty ... i nie chciałem, żeby tak było.

Spójrz na to inne question ... ponieważ w drugim pytaniu zamieszczam kod, który możesz łatwo zmodyfikować ...i jest prawie dokładnie tym, co sugeruje Chris Becke w swojej odpowiedzi.

7

proste i łatwe rozwiązanie :)

miał ten problem, próbowałem zmienić wartości alfa i mnożenia lewostronnego, ale nie było innego problemu - antyaliasing czcionek ClearType i gdzie nie pokazane prawidłowo (brzydkie brzegi). Więc co zrobiłem ...

  1. Skadruj (bitmapy, grafiki, itp)
  2. BitBlt wymaganego prostokąta z tej sceny (taki sam jak prostokąta tekstu, z miejsca, gdzie chcesz, aby tekst, który ma być) do pamięci DC z kompatybilną bitmapą wybraną przy 0,0 docelowym współrzędnych
  3. Narysuj swój tekst do tego prostokąta w pamięci DC.
  4. Teraz AlphaBlend ten prostokąt bez AC_SRC_ALPHA w BLENDFUNCTION i żądanym SourceConstantAlpha z tej pamięci DC wraca do swojej sceny DC.

myślę Załatwione :)

0

Ograniczona odpowiedź do konkretnej sytuacji:

Jeśli masz grafikę z kanałem alfa i chcesz narysować tekst nieprzezroczysty nad lokalnie nieprzezroczystym tle, najpierw przygotuj 32-bitową bitmapę za pomocą 32-bitowych pędzli utworzonych za pomocą CreateDIBPatternBrushPt. Następnie skanuj bitmapy odwracające kanał alfa, narysuj tekst w normalny sposób (włączając w to SetBkMode do TRANSPARENT), a następnie odwróć alfa ponownie w bitmapie. Możesz pominąć pierwszą inwersję, jeśli odwrócisz alfa swoich pędzli.

Powiązane problemy