Jakub Florczyk - Blog o programowaniu .NET i Android

Programista praktyczny

Przezroczyste grafiki w .NET Compact Framework

Compact Framework nie wspiera rysowania przezroczystych grafik. Wszelkie rysowanie grafiki PNG lub GIF (z przezroczystością) zakończy się efektem jak poniżej:

nocolorkey

Grafika ToolBar-a wyrysowała się z zielonym tłem, ponieważ ten kolor był ustawiony jako kolor przezroczysty.

Kod użyty do rysowania:

// Grafika z resources
Image img = Properties.Resources.Buttons;
// Rysowanie
graphics.DrawImage(img, 0, 0);

Możemy jednak w prosty sposób wskazać Graphics-owi kolor, który ma zostać pominięty podczas rysowania, aby uzyskać efekt jak poniżej:

colorkey

Grafika tym razem wyrysowała się poprawnie, pomijając kolor przezroczystości.

Aby uzyskać taki efekt musimy wskazać Graphics-owi kolor (w praktyce jest to przedział kolorów), które mają być potraktowane jako przezroczyste.

Kod użyty do rysowania:

// Grafika z resources
Image img = Properties.Resources.Buttons;
// Atrybuty grafiki
ImageAttributes imageAttr = new ImageAttributes();
Color colorKey = new Bitmap(img).GetPixel(0, 0);
imageAttr.SetColorKey(colorKey, colorKey);
graphics.DrawImage(img, new Rectangle(x, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttr);

W trakcie używania ImageAttributes trzeba pamiętać o kilku rzeczach.
- po pierwsze ColorKey jest przedziałem kolorów, co oznacza iż w przypadku gdy mamy jeden kolor przezroczystości musimy ustawić dolny i górny indeks tak samo.
- po drugie cała sztuczka polega na wskazaniu koloru przezroczystości, w przykładzie jak powyżej użyłem metody GetPixel do pobrania koloru punktu na pozycj 0,0. W praktyce jednak warto zastąpić tą metodę parametrem do ustawiania koloru przezroczystości aby uchronić się przed niespodziankami.
- po trzecie musimy pamiętać iż CF nie wspiera przezroczystych kontrolek, co oznacza iż przed rysowaniem przezroczystej grafiki musimy mieć inne elementy pod spodem aby całość poprawnie wyglądała; może to być nawet kolor tła.
- po czwarte CF nie wspiera grafik o różnej przezroczystości jak np. PNG, więc nie ma szans abyśmy uzyskali przenikające się grafiki.

Na pocieszenie powiem jednak, że mamy dostęp do funkcji AlphaBlend o której napiszę kilka słów w którymś z kolejnych postów.

« Previous post
Next post »

5 ResponsesLeave one →

  1. Adam Ciszewski

     /  2009-06-18

    Bardzo fajny artykul ! dla mnie jako dla początkującego programisty taki opis/tutorial okazal sie bardzo, bardzo przydatny…
    pozdrawiam i dziekuje,
    cichy3000

  2. Piotr G

     /  2010-01-02

    Witam [VB2008]
    Czy tylko tak mozna zdjąć kolor z Graphica czy z kontrolek też np. picturebox itp? Oraz jeszcze jedno pytanie jak zrobić zdarzenie onclick dla tak wyrysowanego graphica ?

  3. Jakub Florczyk

     /  2010-01-03

    @Piotr G

    Ad 1. Ta metoda dotyczy tylko Graphics-a. W kontrolkach jest to tylko możliwe, jeżeli napiszemy własny kod rysowania poszczególnych elementów.

    Ad 2. Trzeba się podpiąć pod metody MouseDown, MouseUp, Click, DoubleClick kontrolki. A najlepiej to przeciążyć wbudowane implementacje.

  1. Jakub Florczyk » Półprzezroczyste grafiki .NET Compact Framework

Leave a Reply