Alpha Blending - Czyli półprzezroczysty obrazek
Bru2s
Co to jest alpha blending? Więc według encyklopedii jest to obliczeniowa technika obróbki grafiki służąca do obliczania przejrzystości elementów obrazu. Pewnie, nie wiele wam to mówi więc postaram się wam to wytłumaczyć na przykładzie. Załóżmy że mamy w 1 komponencie TImage jakąś graficzkę a w drugim mamy jakąś mniejszą. Naszym zadaniem jest nałożenie jednej na drugą ale tak aby ta ze spodu "prześwitywała" przez tą na wierzchu i tu z pomocą przychodzi nam alpha blending. Oto prosty kod w BCB który spełnię to zadanie:
Na formularz wstaw 2 komponenty TImage, 1 TEdit i 1 TButton.
W pierwszym TImage będzie "podkład" czyli grafika która będzie znajdywała się pod spodem. W drugim będzie grafika która znajdzie się na górze.
W zdarzeniu OnClick dla Button1 wstaw taki kod:
int alfa=StrToInt(Edit1->Text); //poziom przezroczystości od 0-255
int r1,g1,b1,r2,g2,b2,rk,gk,bk; //deklaracja zmiennych
for(int y=0;y<Image2->Height;y++)
for(int x=0;x<Image2->Width;x++)
{
r1=GetRValue(Image1->Canvas->Pixels[x][y]); //pobieranie czerwonego koloru do zmiennej
g1=GetGValue(Image1->Canvas->Pixels[x][y]); //pobieranie zielonego koloru do zmiennej
b1=GetBValue(Image1->Canvas->Pixels[x][y]); //pobieranie niebieskiego koloru do zmiennej
r2=GetRValue(Image2->Canvas->Pixels[x][y]); //pobieranie czerwonego koloru do zmiennej
g2=GetGValue(Image2->Canvas->Pixels[x][y]); //pobieranie zielonego koloru do zmiennej
b2=GetBValue(Image2->Canvas->Pixels[x][y]); //pobieranie niebieskiego koloru do zmiennej
//obliczanie średniego koloru pixela
rk=(alfa*((r2+64)-r1))/256+r1-(alfa/4);
gk=(alfa*((g2+64)-g1))/256+g1-(alfa/4);
bk=(alfa*((b2+64)-b1))/256+b1-(alfa/4);
// wyświetlanie wszystkiego w Image1
Image1->Canvas->Pixels[x][y]=RGB(rk,gk,bk);
}
Teraz wystarczy wczytać jakieś obrazki do Image1 i Image2 i skompilować :)
Chodź ten artykuł jest krótki, ale myślę że dość treściwy i komuś się to przyda :) Ponieważ to mój pierwszy artykuł więc nie bądźcie zbyt krytyczni, czekam na wasze komentarze.
U mnie kod wygląda tak:
Jak wstawie stałą wartość ALFA to działa a jak nie to nie działa WTF? FFS? :}
CZemu nie ma podanychwartosci jaiie moze przyjac Alfa bo ja dfalem coś takiego 255*(y/wysokosc_obrazka) i wyszlo na tyle ze w ogole nie mam przezroczystosci tylko ten sam obrazek :C
4x dłuższego też;-)
To mam dla Was coś czterdziestokrotnie szybszego (mojej produkcji):
U mnie działa nawet jeśli mapy są o różnych ilościach kolorów ;) Jedyny warunek to to że muszą to być bitmapy
Robilem juz blending, ale w delphi i obliczanie przejscia w asemblerze. Powinienes dodac jeszcze, ze obie mapy musza miec jednakowa ilosc kolorow. Ciezko jest blending robic dla map <= 255 kolorow.
No i wszystko jasne :)
Heh :) Tylko jak to przetlumaczyc na Delphi :D