Hlavní
Hlavní strana
Seznam článků
Nejčtenější články
Progres e-mailem
Visual C++ FAQ

Seriály
COM
ISAPI

banner2.gif (2546 bytes)

Nenechte si ujít
Neobdélníková okna
Tisk bez Preview
MFC a DLL
Logo v MDI ploše
Kouzla s kombo-boxem
Výjimky v C++

banner.gif (3305 bytes)

Průhledné bitmapy 2.díl Jan Odvárko
17.11.1999
[Hlavní stránka]  |  [Rubrika]

2.1 Rastrové operace
Rastrovou operací rozumíme výsledek kombinace bitů ze zdrojové bitmapy, cílové bitmapy a aktuálního štětce (vzoru). Jak jsme se již dověděli v metodách BitBlt a StretchBlt tuto operaci specifikuje parametr dwROP. Protože bitmapy jsou tvořeny maticí bodů, představují tyto operace logické operace právě mezi těmito body. Pro následující kapitoly platí, že bod s hodnotou 0 odpovídá černé barvě a bod s hodnotou 1 bílé barvě.

2.1.1 SRCOPY
Tato operace provádí přímé kopírování zdrojového kontext do cílového. Použitím této operace můžeme beze změny vytisknout bitmapu.

jo_131199_transparentbitmap1_obr5.gif (2404 bytes)

 

2.1.2 SRCAND
Tato operace kombinuje body zdrojového a cílového kontext pomocí logické operace AND. Jak uvidíme později, pomocí této operace můžeme vytisknout pouze černé plochy zdrojové bitmapy a ostatní budou v cílovém kontextu ponechány beze změny.

jo_131199_transparentbitmap1_obr6.gif (2407 bytes)

 

2.1.3 SRCPAINT
Pomocí této operace se body zdrojové a cílové bitmapy kombinují pomocí logické operace OR. Podívejme se opět na následující obrázek.

jo_131199_transparentbitmap1_obr7.gif (2337 bytes)

 

2.1.4 SRCINVERT
Tato rastrová operace používá pro kombinaci bitů jednotlivých bitmap logickou operaci XOR. Pokud je použita dvakrát, uvede se vše do původního stavu. Jak uvidíme později, lze tuto operace také výhodně použít pro transparentní tisk.

jo_131199_transparentbitmap1_obr8.gif (2398 bytes)

 

2.2 Transparentní tisk pomocí masky
Na předcházejících příkladech je jasně patrné, jak fungují rastrové operace a můžeme je tedy použít k transparentnímu kreslení bitmap. V prvním příkladě (z předchozího dílu), který jsme probírali bylo jasné, že červené pozadí není určeno pro tisk a mělo by být při této operaci vynecháno. Nějakým způsobem musíme tedy definovat, že červená barva je průhledná a všechny body bitmapy, které jsou červené při tisku ignorovat (takový bod pak nazýváme transparentní). Tento problém se obvykle řeší pomocí masky.

2.3 Maska
Maska se skládá ze dvou částí, neprůhledná část (opaque), která je složena z černých bodů a průhledná část (transparent), jež je složena z bílých bodů. V neprůhledné části jsou body zdrojové bitmapy zobrazeny a v průhledné nikoliv. Tím je zajištěna definice průhledných a neprůhledných částí jedné bitmapy. Jelikož je maska vždy složena ze dvou barev (černá a bílá), je ideální použít černobílou (monochromatickou) bitmapu (může však být použita i barevná).

2.4 Konverze černobílých a barevných bitmap
Pokud pro masky používáme černobílé bitmapy, je důležité vědět, jakým algoritmem se převádějí černobílé bitmapy na barevné a naopak. Pro tyto konverze je základním údajem aktuální barva textu (popředí) a aktuální barva pozadí. Tyto barvy mohou být explicitně nastaveny pomocí metod SetTextColor (popředí) a SetBkColor (pozadí).

Při převodu černobílé bitmapy na barevnou jsou všechny černé bity (0) konvertovány na barvu popředí (text) a všechny bílé bity na barvu pozadí. Pokud tedy v kontextu nastavíme barvu textu na červenou, barvu pozadí na zelenou a provedeme konverzi černobílé bitmapy bude výsledek následující (nejdříve ukázka zdrojového kódu).

  pDC->SetTextColor(RGB(25500));
  pDC->SetBkColor(RGB(02550));

jo_131199_transparentbitmap1_obr9.gif (1912 bytes)

Při převodu barevné bitmapy na černobílou je postup podobný, všechny bity jejichž barva odpovídá aktuální barvě pozadí jsou převedeny na bílé a všechny ostatní bity jsou převedeny na černé (barva textu není v tomto případě použita).

Pro úplnost dodejme, že ke konverzi z černobílé bitmapy na barevnou dochází tehdy, vložíme-li tuto bitmapu do barevného kontextu. Podobně dochází ke konverzi barevné bitmapy,  vložíme-li ji do černobílého kontextu.

2.5 Metoda pozitivní masky - True Mask Method
První způsob průhledného kreslení nevyžaduje změnu zdrojové bitmapy. Tato vlastnost je mnohdy velice užitečná, avšak je vykoupená jednou rastrovou operací navíc. Přepokládejme tedy existenci zdrojové bitmapy a masky, která definuje průhledné (bílá barva) a neprůhledné (černá barva) části.

jo_131199_transparentbitmap1_obr10.gif (1600 bytes)

Nyní si ukážeme zdrojový kód, který pomocí tří rastrových operací vykreslí bitmapu transparentně (tzn. červené body budou ignorovány). Ukázka je maximálně redukována, takže nekontroluje chybové návratové hodnoty a nevrací kontexty do původních stavů. Ukázka dále přepokládá, že existují a jsou v pořádku nahrány dvě bitmapy oSourceBmp a oMaskBmp, že existuje inicializovaný ukazatel na cílový kontext pDC a proměnné nWidth a nHeight, které obsahují rozměry obou bitmap.

  CDC oSourceDC, oMaskDC;
  oSourceDC.CreateCompatibleDC(pDC);
  oMaskDC.CreateCompatibleDC(pDC);

  oSourceDC.SelectObject(&oSourceBmp);
  oMaskDC.SelectObject(&oMaskBmp);

  pDC->SetBkColor(RGB(255255255));
  pDC->SetTextColor(RGB(000));
  
  pDC->BitBlt(00, nWidth, nHeight, &oSourceDC, 00, SRCINVERT);
  pDC->BitBlt(00, nWidth, nHeight, &oMaskDC, 00, SRCAND);
  pDC->BitBlt(00, nWidth, nHeight, &oSourceDC, 00, SRCINVERT);

První akcí je vytvoření kompatibilních kontextů zařízení a vložení odpovídajících bitmap do těchto kontextů. Dalším krokem je nastavení barvy textu a pozadí, které  zajišťuje správnou konverzi černobílé masky. Toto nastavení je provedeno pouze "pro jistotu", protože jsou to implicitní hodnoty kreslicího kontextu. Poslední akcí jsou tři rastrové operace, které zajišťují transparentní kreslení.

.jo_131199_transparentbitmap1_obr11.gif (2859 bytes)

  • SRCINVERT
Provede XOR zdrojové bitmapy do cílového kontextu.
  • SRCAND
Provede AND masky do cílového kontextu. Všechny bílé (průhledné) bity masky ponechají cíl beze změny, zatímco neprůhledné cíle jsou nastaveny na černé.
  • SRCINVERT
Provede druhý XOR zdrojové bitmapy do cílového kontextu, který všechny průhledné bity nastaví do jejich původního stavu a neprůhledné bity jsou přímo kopírovány. 

Příště metoda černého zdroje...


Podobné články:

<<Předchozí
Průhledné bitmapy 1.díl
Článek je zařazen do seriálu Následující>>
Průhledné bitmapy 3.díl

Kdo Otázka nebo připomínka

Prohlížení příspěvků nebo nový příspěvek

O firmě... Kontakt Ostatní