gd2 – wykrywanie przezroczystych obszarów png
Przezroczystość na obrazkach bywa problematyczna. Przykładowo, generator sklejonych obrazków (pod css-sprites) może bez problemu przygotować obrazki w formacie png. Taki obrazek wyświetli się niemal wszędzie. Niemal, ponieważ IE6 nie obsługuje przezroczystych png* i trzeba np. przygotować wersję tworzącą obrazek jako gif** (* – tak, są nadal klienci używający IE6, ** – przezroczysty gif wygenerowany z kilku mniejszych obrazków stawia przed programistą sporo wyzwań).
Do pobierania wartości alpha (poziomu przezroczystości) użyjemy funkcji imagecolorat. Na wejściu przyjmuje ona parametry: obrazek, x, y. Na wyjściu otrzymujemy liczbę zawierająca wszystkie składowe, z których trzeba wyłuskać odpowiednią składową. Robimy to poprzez zapis:
$alpha = ($rgb >> 24 ) & 0xFF ;
(przesunięcie bitowe + AND).
O ile kolory zawierają się w granicach 0 – 255, to alpha przyjmuje wartości 0 – 127.
Przykład połączenia wszystkiego w całość:
<? $im = imagecreatefrompng("ikonki.png"); $w = imagesx( $im ) ; $h = imagesy( $im ) ; $im2 = imagecreatetruecolor( $w, $h ) ; for( $a = 0 ; $a < $w; $a++ ) { for( $b = 0 ; $b < $h; $b++ ) { $rgb = imagecolorat($im, $a, $b); $alpha = ($rgb >> 24 ) & 0xFF ; $alpha_r = $alpha*2 ; $kolor = imagecolorallocate( $im2, $alpha_r, $alpha, $alpha ) ; imagesetpixel( $im2, $a, $b, $kolor ) ; } } header( "Content-type: image/png" ) ; echo imagepng( $im2 ) ; ?>
Na wyjściu dostaniemy coś w rodzaju:
Jak widać ikonki są wygładzone, a czerń występuje tylko w tych miejscach, które były nieprzezroczyste.
Sama metoda będzie dość powolna przy dużych obrazkach (ale nie tak powolna jak generowanie 3D), więc raczej zastosowanie znajdzie przy jednorazowych operacjach na małych i średnich obrazkach. Przykładowo po określeniu przezroczystych obszarów można przygotować nowy obrazek, który będzie zawierać wyłącznie widoczną treść. Można także określić aktywny obszar pod dalsze operacje (crop, zmianę wielkości).
Dodaj komentarz