Tym razem, zaprezentuję Państwu jak przy użyciu PHP zbudować galerię zdjęć :) Oczywiście można wykonać takową w samym HTML ale po co utrudniać sobie życie i tracić czas na pisanie kodu jak ktoś może zrobić to za nas. Dzięki PHP nie będziemy również musieli tworzyć miniaturek naszych fotografii - powstaną one automatycznie. Nasz 'System' będzie składał się z dwóch plików:
mini.php - służącego do wygenerowania podglądu zdjęcia, oraz
galeria.php - który z wykorzystaniem tego pierwszego stworzy całą galerię.
Generowanie albumu będzie polegać na wyświetleniu miniatur wszystkich zdjęć z zadanego katalogu. Miniaturki tworzone będą dynamicznie przy użyciu funkcji PHP, dzięki czemu unikniemy konieczności tworzenia ich ręcznie bądź zmniejszania dużych obrazków tagami html-a co już w ogóle jest pomysłem wczesnoporonnym. Będziemy mogli zdefiniować ilość zdjęć wyświetlanych na jednej stronie (wierszy i kolumn), ich jakość oraz ustalać wielkość. Ponadto dodamy możliwość podpisywania fotografii. Jeśli w katalogu znajdzie się plik o takiej samej nazwie co zdjęcie lecz z rozszerzeniem .txt jego zawartość zostanie uznana za opis. A więc do dzieła...
Wersja dla niecierpliwych:
- Gotowy przykład działania można obejrzeć tutaj
- A kody źródłowe całego pomysłu tu
Wersja dla cierpliwych:
Ponieważ najlepiej jest uczyć się na przykładach, zamieszczam kod źródłowy wraz z komentarzami które nie powinny zostawić niedomówień :P Jeśli masz problem ze zrozumieniem którejś instrukcji polecam lekturę http://php.net - tam znajdziesz szczegółowy opis każdej z nich.
Plik galeria.php
<html>
<body>
<center>
<table style="border: 1px solid black; text-align: center"><tr><td>Galeria
<?php
/*
Ustalamy w jakim katalogu znajduja sie zdjecia oraz
ile wierszy i kolumn bedzie tworzyc galeria jednej strony.
*/
define('KATALOG_ZDJEC','./img/');
define('WIERSZY',2);
define('KOLUMN',2);
/*
Przeczesujemy wybrana lokalizacje w poszukiwaniu plikow .jpg
i zapujemy ich nazwy w tablicy $album. Wszelkie informacje o
plikach beda teraz odczytywane z tej tablicy dzieki czemu ograniczymy
mielenie dyskiem do minimum :)
*/
$x=0;
foreach (glob(KATALOG_ZDJEC."*.jpg") as $zdjecie) $album[$x++]=$zdjecie;
/* Zliczamy ile fotek lacznie pojawi sie na jednej stronie oraz calkowita ich liczbe */
$na_stronie=WIERSZY*KOLUMN; $razem=count($album);
/*
Dzieki czemu mozemy wyliczyc liczbe stron. Czesc calkowita z dzielenia
liczby fotek przez liczbe zdjec na jednej stronie da laczna liczbe stron.
Jesli zostanie jakas reszta z dzielenia to znaczy ze potrzebujemy jeszcze
jednej strony dla wyswietlenie kilku ostatnich zdjec
*/
$stron=floor($razem/$na_stronie); $stron+=$razem % $na_stronie ? 1:0;
/*
Zmienna $pokaz_strone przechowuje nr. akutalnej strony do wyswietlenia.
Jej wartosc odczytywana jest z adresu strony (np. https://www.szabloniki.com/galeria.php?pokaz_strone=4)
Jesli wartosc nie zostala ustalona (https://www.szabloniki.com/galeria.php)
przyjmujemy ze wyswietlamy strone 1
*/
$pokaz_strone=$_GET['pokaz_strone']; if (!isset($pokaz_strone)) $pokaz_strone=1;
/*
Bedziemy odczytywac tylko te fragmenty tablicy $album ktore zawieraja
zdjecia wystepujace na danej stronie, dlatego potrzebujemy ustalic
jaki bedzie to obszar
*/
$start=($pokaz_strone-1) * $na_stronie;
$stop=($pokaz_strone==$stron) ? $razem % $na_stronie: $na_stronie; $stop+=$start;
echo "<table style='border: none'><tr>";
/* Z wybranych elementow rusyjemy tabelke */
for ($x=$start;$x<$stop;$x++){
/* Jesli osiagnieto ustalona liczbe kolumn przechodzimy do nastepnego wiersza */
if (!($x % KOLUMN)) echo "</tr><tr>";
/*
Tworzymy obrazek ktory wygenerowany zostanie przez skrypt mini.php na podstawie
przekazanej nazwy pliku
*/
echo "<td><a href=\"".$album[$x]."\" target=\"_blank\"><img src=\"mini.php?fotka="."{$album[$x]}\"></a>";
/*
Ponizsze linie sprawdzaja czy w katalogu ze zdjeciem istnieje taki sam
plik z roszerzeniem .txt. Jesli tak, wyswietla jego zawartosc pod zdjeciem
*/
list($info)=explode('.',basename($album[$x]));
if(file_exists(KATALOG_ZDJEC.$info.".txt")){
$plik=fopen(KATALOG_ZDJEC.$info.".txt","r");
$opis=fgets($plik);
fclose($plik);
echo "<br>$opis";
}
echo "</td>";
}
echo "</tr><table>";
/* Jesli mamy wiecej niz jedna strone wyswietlimy ich liste */
if ($stron>1){
echo "<br>";
echo "Strona: "; for($x=1;$x<=$stron;$x++) {
/* Bierzaca strone pogrubimy a pozostale beda linkami z odpowiednim adresem */
if ($pokaz_strone==$x){echo "<b> $x </b>";} else {echo "<a href=\"galeria.php?pokaz_strone=$x\"> $x </a>";}
}
}
?>
</td></tr></table>
</center>
</body>
</html>
|
Plik mini.php
/*
Ten plik jako wynik swojego dzialania bedzie generowal miniaturke
zdjecia przekazanego jako parametr wywolania skryptu
(np. https://www.szabloniki.com/mini.php?fotka=obrazek.jpg), dlatego tez
musimy poinformowac przegladarde aby traktowal go jak plik graficzny.
*/
header('Content-type: image/jpeg');
/* Definiujemy wymiary miniaturki */
define ('SZEROKOSC',100);
define ('WYSOKOSC',100);
/* Otwieramy orginalne zdjecie przekazane w adresie strony */
$orginal=imagecreatefromjpeg($_GET['fotka']);
/*
Pobieramy wymiary orginalnego zdjecia, sa one potrzebne dla
dla wygenerowania pomniejszonej wersji.
*/
list($org_szer,$org_wys)=getimagesize($_GET['fotka']);
/* Tworzymy nowy obraz o ustalonych wczesniej wymiarach miniaturki */
$minitaturka=imagecreatetruecolor(SZEROKOSC,WYSOKOSC);
/*
Przy pomocy tej funkcji tworzymy miniature pliki graficznego.
Jesli dysponujemy odpowiednio szybka maszyna, lepszy efekt uzyskamy
zamieniajac ja na:
imagecopyresampled($minitaturka,$orginal, 0, 0, 0, 0 ,SZEROKOSC,WYSOKOSC,$org_szer,$org_wys);
ktora oprocz zmniejszenia fizycznych rozmiarow, wygladza krawedzie oraz poprawia ostrosc.
*/
imagecopyresized($minitaturka,$orginal, 0, 0, 0 , 0 ,SZEROKOSC,WYSOKOSC,$org_szer,$org_wys);
/*
Gotowa miniature wysylamy do przegladarki. Ostatni parametr okresla jakosc
generowanego brazu (0-100%). Czym mniejsza wartosc tym gorsza jakosc
zato rozmiar pliku znacznie mniejszy
*/
imagejpeg($minitaturka,NULL,70);
|
Dziekuję za uwagę - wszelkie niejasności proponuje umieszczać w komentarzach :)
|