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