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

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*