CompZone.Org :: Artykuły :: PHP
Jaki jest Twój wiek?
40 - 59
26 - 39
19 - 25
13 - 18
12 i mniej
60 i więcej
Sonda Wyniki

Add to Google

Generowanie miniatur w PHP

Generowanie miniatur jest nieodłączną częścią skryptu galerii. W jaki sposób możemy automatycznie generować miniatury? Jak poradzić sobie ze skalowaniem? Jak zapisać obrazki na dysku? I jak to zrobić w skrypcie PHP. Tego wszystkiego nauczycie się czytając

Wstęp

Często stajemy przed koniecznością wygenerowania w PHP miniatur obrazów. Możemy do tego wykorzystać bibliotekę GD. W tym artykule nauczymy się jak stworzyć miniaturkę z pliku JPG. Równie łatwo można uzyskać efekt tworzenia miniaturki z plików GIF czy PNG.

Instalacja GD

Przed rozpoczęciem nauki musimy przygotować sobie środowisko pracy. Skrypt będzie wykorzystywał bibliotekę graficzną GD. Jest ona zainstalowana na większości serwerach. Nauczymy się teraz jak zainstalować to rozszerzenie PHP na windowsie i serwerach linuksowych (i podobnych)

Instalacja GD pod windowsem

Pod windowsem instalacja ogranicza się jedynie do załadowania odpowiedniej biblioteki dostarczonej wraz z dystrybucją PHP. W celu załadowania biblioteki otwieramy plik php.ini, który zazwyczaj znajduje się w katalogu głównym windowsa (zwykle c:\windows lub c:\winnt). Znajdujemy linię:

extension_dir = "ext/"

Zmienna extension_dir może mieć inną wartość. Upewnijmy się, że plik php_gd2.dll znajduje się w ścieżce wskazywanej przez tą zmienną. Jeśli tak nie jest kopiujemy plik php_gd2.dll bądź zmieniamy wartość zmiennej na poprawną ścieżkę.

Następnie przechodzimy do linii:

;extension=php_gd2.dll

i usuwamy średnik znajdujący się na początku. Wpis powinien wyglądać tak:

extension=php_gd2.dll

Teraz uruchamiamy ponownie serwer i wszystko powinno już działać. Teraz używając funkcji phpinfo() sprawdzamy, czy moduł GD2 został załadowany. Jeśli tak powinna się znaleźć tam odpowiednia informacja. Jeżeli tak nie jest sprawdźmy jeszcze raz czy na pewno plik php_gd2.dll znajduje się w katalogu wskazywanym prze zmienna extension_dir.

Instalacja GD pod linuksem

Instalacja biblioteki GD2 może przebiegać różnie w zależności od dystrybucji. Poniżej przedstawiam sposób niezależny od dystrybucji. Zakładam jednak, że dystrybucja zawiera podstawowe narzędzia programistyczne (kompilator, make, itd...). Począwszy od wersji 4.3.0 PHP jest dostarczana z własną paczką GD2. Aby zainstalować PHP z obsługą GD należy podczas uruchamiania skryptu konfigurującego ./configure dodać parametr --with-gd. Instalacja wyglądałaby następująco:

./configure --with-gd
make
make install

Być może konieczne przed kompilacją okarze się doinstalowanie bibliotek libpng i libjpeg.

Jak to zrobić w PHP?

Stwórzmy plik thumbs.php. Jego zadaniem będzie wygenerowanie miniatury. Ścieżkę do dużego obrazka przekażemy używając metody get w parametrze path. Oto pierwsze linie kodu:

 <?php

//Przypisujemy do zmiennej $img_path ścieżke do obrazka
$img_path = $_GET['path'];

//Tworzymy scieżkę do miniaturki
$thumb_path = substr($img_path,0,strrpos($img_path, '.')).'.th.jpg';

?>

Jak widać w kodzie powyżej miniaturka będzie miała tylko dodane .th przed rozszerzeniem. Na przykład z nazwy sample.jpg powstanie sample.th.jpg. Ustalmy, że miniaturki bedą miały maksymalny rozmiar 100x100. W poniższym kodzie wykorzystujemy po raz pierwszy funkcję z biblioteki GD: getimagesize(). Funkcja ta pobiera informacje o obrazie (rozmiar, typ, itd...).

 <?php

//Przypisujemy do zmiennej $img_path ścieżke do obrazka
$img_path = $_GET['path'];

//Tworzymy scieżkę do miniaturki
$thumb_path = substr($img_path,0,strrpos($img_path,'.')).'.th.jpg';

//ustalamy maksymalny dopuszczalny rozmiar miniatury
$max_width=$max_height=100;

//Sprawdzamy czy obraz istnieje
if(!file_exists($img_path))die('<p>Plik obrazu nie istnieje</p>');

//Pobieramy informacjie o obrazie
$img_attr = getimagesize($img_path);

//Sprawdzamy czy obraz jest wiekszy na szerokość czy na wysokość
// i zmniejszamy odpowiednio rozmiar
// $img_attr[0] - szerokosc, $img_attr[1] - wysokość
if($img_attr[0]>$img_attr[1]){
$scale = $img_attr[0] / $max_width;
}else{
$scale = $img_attr[1] / $max_height;
}
?>

Mamy już obliczaną skalę. Czas teraz na stworzenie miniatury. W tym celu posłużymy się funkcją imagecreatetruecolor(). Następnie stworzymy miniaturę używając procedury imagecopyresampled(). Wynik zapiszemy w pliku używając procedury imagejpeg().

  
<?php

//Przypisujemy do zmiennej $img_path ścieżke do obrazka
$img_path = $_GET['path'];

//Tworzymy scieżkę do miniaturki
$thumb_path = substr($img_path,0,strrpos($img_path,'.')).'.th.jpg';

//ustalamy maksymalny dopuszczalny rozmiar miniatury
$max_width=$max_height=100;

//Sprawdzamy czy obraz istnieje
if(!file_exists($img_path))die('<p>Plik obrazu nie istnieje</p>');

//Pobieramy informacjie o obrazie
$img_attr = getimagesize($img_path);

//Sprawdzamy czy obraz jest wiekszy na szerokość czy na wysokość
// i zmniejszamy odpowiednio rozmiar
// $img_attr[0] - szerokosc, $img_attr[1] - wysokość
if($img_attr[0]>$img_attr[1]){
$scale = $img_attr[0] / $max_width;
}else{
$scale = $img_attr[1] / $max_height;
}

//Tworzymy obraz miniaturki
$w = floor($img_attr[0]/$scale);
$h = floor($img_attr[1]/$scale);
$thumb = imagecreatetruecolor($w,$h);

//Kopiujemy obraz pomniejszajac go,
imagecopyresampled($thumb, imagecreatefromjpeg($img_path), 0, 0, 0, 0, $w, $h, $img_attr[0], $img_attr[1]);

//Zapisujemy do pliku (jakość 85)
imagejpeg($thumb,$thumb_path,85);
?>

Wyświetlamy obraz w przeglądarce

Miniatura już stworzona. Jednak gdybyśmy zapragnęli zamiast zapisać miniaturę do pliku wyświetlić ją, można to zrobić modyfikując powyższy skrypt. W tym celu zamieniamy linie:

 $thumb_path = substr($img_path,0,strrpos($img_path,'.')).'.th.jpg';
na
 $thumb_path = '';
oraz przed linią:
 imagejpeg($thumb,$thumb_path,85);
dopisujemy:
 header('Content-type: image/jpeg');

Zakończenie

W ten oto sposób wyświetlimy naszą miniaturę zamiast zapisać ją do pliku. Stanie się tak, gdyż ścieżka jest pusta. W rzeczywistości zamiast podawać pustą ścieżką można wogóle nie podawać 2 ostatnich parametrów.

Kodie @ 26-06-2006 13:34
Brak komentarzy...
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!