In acest tutorial vă voi învăța cum să creați thumbnail-uri ale unor imagini mai mari ca dimensiune.
Thumbnail-urile sunt niște imagini în miniatură de o rezoluție mai mică. Odată apăsat un thumbnail vom deschide poza originală. Să vedem în continuare cum vom face acest lucru posibil. În primul rând avem nevoie de două foldere: unul pentru imaginile originale, și îl vom denumi pictures și unul pentru thumnail-uri pe care îl vom denumi thumbnails. Ceea ce este foarte important este că în aceste două foldere nu trebuie să se găsească decât imagini de tip JPG altfel vom întâmpina erori. Este evident că putem adapta scriptul pentru orice format de imagine, GIF sau PNG însă scopul principal al acestui tutorial este acela de a vă face să întelegeți care sunt pașii pe care trebuie sa îi urmați când faceți un asemenea script.
PHP-ul pe care îl rulați trebuie să aibă activată libraria GD2 pentru a rula acest script, altfel veți întâmpina o eroare prin care vă va fi adus la cunoștință că funcția pentru imagini nu poate fi găsită. Dacă librăria GD2 nu este activă o puteți activa în felul următor în mediul WINDOWS: adăugați liniile următoare în php.ini:
Cod:
extension=php_gd2.dll
Vom deschide directorul pictures și thumbnails și vom citi numele fiecărui fișier care există în aceste directoare și le vom memora în vectorul $pictures și $thumbnails
Cod:
$open_pictures = opendir("pictures");
while($file = readdir($open_pictures))
{
if(substr($file, 0, 1) != '.')
{
$pictures[] = $file;
}
}
closedir($open_pictures);
$open_thumbnails = opendir("thumbnails");
while($file = readdir($open_thumbnails))
{
if(substr($file, 0, 1) != '.')
{
$thumbnails[] = $file;
}
else
{
$thumbnails = array();
}
}
closedir($open_thumbnails);
?>
Vom reține apoi în două variabile de tip vector numele pozelor care se află în folderul pictures dar nu se află în folderul thumbnails, cât și pozele care se află în folderul thumbnails dar nu se afla în folderul pictures. Astfel pentru fiecare poză care exista în folderul pictures dar nu se află și în folderul thumbnails îi vom crea o poză în miniatură cu dimensiunile stabilite prin variabila $max_width și $max_width bineânțeles păstrând proporțiile pozei originale calculate cu ajutorul variabilei $ratio, astfel încât dacă lungimea pozei originale este mai mare decât înălțimea, atunci $ratio va lua valoarea lungimei maxime setate în variabila $max_width împărțită la lungimea pozei originale, iar în caz contrar $ratio va lua valoarea înălțimii maxime setate pentru thumbnail împărțite la înălțimea pozei originale.
Rezoluția pozei originale o aflăm cu ajutorul funcției getimagesize() care returnează un vector cu atributele pozei.
Vom afla în continuare noile dimensiuni ale pozei în miniatură calculate în variabilele $thumbnail_width și $thumbnail_height prin îmulțirea dimensiunilor pozei originale cu $ratio.
Cod:
$diff_pic = array_diff($pictures, $thumbnails);
$diff_tumb = array_diff($thumbnails, $pictures);
foreach($diff_pic as $key => $value)
{
$image_name = 'pictures/'.$value;
$image_attribs = getimagesize($image_name);
$max_width = 100;
$max_height = 100;
$ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $image_attribs[0] : $max_height / $image_attribs[1];
$thumbnail_width = $image_attribs[0] * $ratio;
$thumbnail_height = $image_attribs[1] * $ratio;
În continuare vom crea acele thumbnail-uri ale pozelor prin aplicarea funcțiilor PHP pentru imagini. Pentru început vom returna o imagine din poza originală cu ajutorul funcției imagecreatefromjpeg() după care vom crea o imagine neagră cu dimensiunile calculate mai sus pentru thumbnail.
Numele pozei în miniatură va fi același cu numele pozei originale numai că o vom salva în alt director. Calea către thumbnail o vom ține într-o variabilă $thumbnail_name, apoi vom copia imaginea originală peste imaginea thumbnail păstrând proporțiile. Vom crea imaginea jpg în calea specificată în variabila $thumbnail_name cu ajutorul funcției imagejpeg().
Cod:
$image = imagecreatefromjpeg($image_name);
$image_new = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
imageantialias($image_new, true);
$thumbnail_name = 'thumbnails/'.$value;
imagecopyresampled($image_new, $image, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $image_attribs[0], $image_attribs[1]);
imagejpeg($image_new, $thumbnail_name);
imagedestroy($image);
}
?>
Este posibil ca în directorul thumbnails să se afle imagini ale pozelor care nu se mai află în directorul pictures, acestea nu sunt necesare și le vom șterge cu ajutorul funcției unlink().
Vă amintiți că mai sus am aflat care sunt pozele care se afla în directorul thumbnails dar nu se afla în directorul pictures cu ajutorul funcției array_diff() care face diferența dintre valorile primului vector analizat și cel de-al doilea vector.
Cod:
foreach($diff_tumb as $key => $value)
{
unlink("thumbnails/".$value);
}
?>
În acest moment avem create thumbnail-urile imaginilor originale și le vom afișa în pagină încadrate într-un tabel cu $modulo celule, cu link către pozele originale. Mai jos aveți întreg codul sursă pentru crearea imaginilor thumbnail și afișarea acestora în pagină.
Cod:
Thumbnails$open_pictures = opendir("pictures");
while($file = readdir($open_pictures))
{
if(substr($file, 0, 1) != '.')
{
$pictures[] = $file;
}
}
closedir($open_pictures);
$open_thumbnails = opendir("thumbnails");
while($file = readdir($open_thumbnails))
{
if(substr($file, 0, 1) != '.')
{
$thumbnails[] = $file;
}
else
{
$thumbnails = array();
}
}
closedir($open_thumbnails);
$diff_pic = array_diff($pictures, $thumbnails);
$diff_tumb = array_diff($thumbnails, $pictures);
foreach($diff_pic as $key => $value)
{
$image_name = 'pictures/'.$value;
$image_attribs = getimagesize($image_name);
$max_width = 100;
$max_height = 100;
$ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $image_attribs[0] : $max_height / $image_attribs[1];
$thumbnail_width = $image_attribs[0] * $ratio;
$thumbnail_height = $image_attribs[1] * $ratio;
$image = imagecreatefromjpeg($image_name);
$image_new = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
imageantialias($image_new, true);
$thumbnail_name = 'thumbnails/'.$value;
imagecopyresampled($image_new, $image, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $image_attribs[0], $image_attribs[1]);
imagejpeg($image_new, $thumbnail_name);
imagedestroy($image);
}
foreach($diff_tumb as $key => $value)
{
unlink("thumbnails/".$value);
}
$open_thumbnails = opendir("thumbnails");
$l = 0;
$modulo = 4;
echo '
';
while($file = readdir($open_thumbnails))
{
if(substr($file, 0, 1) != '.')
{
if($l % $modulo == 0)
{
echo '';
echo ''; echo ''; echo ' | ';
}
if($l % $modulo == $modulo - 1)
{
echo '
';
}
$l++;
$unfinished = $l % $modulo;
}
}
closedir($open_thumbnails);
if($unfinished != 0)
{
for($k = $unfinished; $k < $modulo; $k++)
{
echo ' | ';
}
echo '';
}
echo '
';
?>