[PHP] Proporcjonalne miniaturki zdjęć używając GD2

Pisząc od nowa system hostingu zdjęć postanowiłem raz na zawsze rozwiązać kwestie miniaturek. W poprzedniej wersji systemu zdjęcia były skalowane do sztywnych proporcji 128x128 – było to rozwiązanie złe i uciążliwe. Większość grafik ma format 4:3 ale w epoce wszechobecnych monitorów 16:10 skalowanie obrazka do proporcji 1:1 daje fatalny efekt.

Na początku musimy dowiedzieć się czy plik dla którego chcemy utworzyć miniaturkę istnieje. Najprościej byłoby użyć funkcji is_file() jednakże nie polecam jej w tym wypadku. Lepiej użyć is_readable() ponieważ jeśli serwer WWW będzie źle skonfigurowany plik może istnieć ale nie będzie można go odczytać.

Kod:

if (!is_readable($file))

{

return FALSE;

}

Wiemy już, że plik istnieje i mamy do niego dostęp. Teraz musimy pobrać rozmiar obrazka i zapisać go w zmiennych $old_x i $old_y.

Biblioteka GD2 udostępnia dwie funkcję służące do pobierania wymiarów obrazka – imageSX() i imageSY(). Jako argument należy im podać zasób RAW utworzony przy pomocy imagecreatefrom***().

Dla większej uniwersalności najlepiej jest wykrywać typ obrazka w sposób pokazany poniżej.

Kod:

$info = @getimagesize($file);

switch ($info[‚mime’])

{

case „image/gif”:

$file = imagecreatefromgif($file);

break;

case „image/jpeg”:

$file = imagecreatefromjpeg($file);

break;

case „image/png”:

$file = imagecreatefrompng($file);

break;

}

$old_x = imageSX($file);

$old_y = imageSY($file);

Aby zachować proporcje obrazu należy obliczyć wg nich nowe rozmiary. Na początku podajemy jaki obrazek byśmy chcieli – standardowa miniatura to 128×128. W przypadku podania zdjęcia 1024×768 zostaną wyliczone rozmiary 128×96. Poniższy kod nie wymaga chyba głębszego objaśnienia:

Kod:

$new_w = 128;

$new_h = 128;

if ($old_x > $old_y)

{

$thumb_w=$new_w;

$thumb_h=$old_y*($new_h/$old_x);

}

if ($old_x < $old_y) { $thumb_w=$old_x*($new_w/$old_y); $thumb_h=$new_h; } if ($old_x == $old_y) { $thumb_w=$new_w; $thumb_h=$new_h; } Teraz gdy już mamy rozmiary miniaturki możemy przystąpić do tworzenia miniaturki. Najpierw należy utworzyć pusty obrazek o rozmiarze miniaturki, w tym celu używamy funkcji ImageCreateTrueColor() Kod:

$th = ImageCreateTrueColor($thumb_w, $thumb_h);

Następnym krokiem będzie utworzenie właściwej miniaturki. Tutaj należy zwrócić uwagę na specyfikę działania GD2. Nie zapisuje ona plików tymczasowych, w związku z tym wymaga dużej ilości pamięci ponieważ cały obrazek w formie bitmapy musi zostać załadowany.

Maksymalny rozmiar obrazka nie może być większy niż pamięć dla php/3MB-1MB.

Kod:

imagecopyresampled($th, $file, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);

Teraz nie pozostaje nam nic innego jak zapisać miniaturkę. W tym celu używamy funkcji imagejpeg()/imagegif()/imagepng() jak w przykładzie poniżej:

Kod:

imagejpeg($th, sciezka do zapisu/plik.jpg);

Ostatni krok jest opcjonalny choć polecany. Należy opróżnić bufor zwalniając pamięć.

W tym celu piszemy:

Kod:

@imagedestroy($file);

@imagedestroy($th);

Jeśli ktoś potrzebuje gotowej funkcji bez wgłębiania się w szczegóły jej działania może śmiało skopiować

ten kod.

0
Zamknij

Choć staramy się je ograniczać, wykorzystujemy mechanizmy takie jak ciasteczka, które pozwalają naszym partnerom na śledzenie Twojego zachowania w sieci. Dowiedz się więcej.