Việc tạo thumnail sẽ giúp bạn giảm kích thước của hình phù hợp cho việc trang trí web và cũng làm giảm dung lượng cho web của bạn. Đoạn code mà mình chia sẻ sau đây làm rất tốt việc đó.
<?php
function resizeImage($sourceFile,$destFile,$width,$height)
{
$proportional = true;
$output = 'file';
copy($sourceFile,$destFile);
$file = $destFile;
if ( $height <= 0 && $width <= 0 ) return false;
# get image size
$info = getimagesize($file);
$image = '';
list($width_old, $height_old) = $info;
$final_width = 0;
$final_height = 0;
$dims = resizeBoundary($width_old, $height_old,$width,$height);
$final_height=$dims['height'];
$final_width=$dims['width'];
# image loading
switch ( $info[2] ) {
case IMAGETYPE_GIF: $image = imagecreatefromgif($file); break;
case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($file); break;
case IMAGETYPE_PNG: $image = imagecreatefrompng($file); break;
default: return false;
}
# This is the resizing/resampling/transparency-preserving magic
$image_resized = imagecreatetruecolor( $final_width, $final_height );
if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
$transparency = imagecolortransparent($image);
if ($transparency >= 0) {
$transparent_color = imagecolorsforindex($image, $trnprt_indx);
$transparency = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
imagefill($image_resized, 0, 0, $transparency);
imagecolortransparent($image_resized, $transparency);
}
elseif ($info[2] == IMAGETYPE_PNG) {
imagealphablending($image_resized, false);
$color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);
imagefill($image_resized, 0, 0, $color);
imagesavealpha($image_resized, true);
}
}
imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);
$output = $file;
# Writing image according to type to the output destination
switch ( $info[2] ) {
case IMAGETYPE_GIF: imagegif($image_resized, $output); break;
case IMAGETYPE_JPEG: imagejpeg($image_resized, $output); break;
case IMAGETYPE_PNG: imagepng($image_resized, $output); break;
default: return false;
}
return true;
}
function resizeBoundary($oldW,$oldH,$newW='',$newH='')
{
if(!($oldW>0 && $oldH>0))
return;
$tempW = ( $oldW * $newH ) / ( $oldH );
$tempH = ( $oldH * $newW ) / ( $oldW );
if($newW =="" && $newH != "")
{
if($newH >$oldH)
{
$dims = resizeBoundary($oldW, $oldH,'',$oldH);
$finalH = $dims['height'];
$finalW = $dims['width'];
}
else
{
$finalH = $newH;
$finalW = $tempW;
}
}
else if($newW !="" && $newH == "")
{
if($newW >$oldW)
{
$dims = resizeBoundary($oldW, $oldH,$oldW,'');
$finalH = $dims['height'];
$finalW = $dims['width'];
}
else
{
$finalH = $tempH;
$finalW = $newW;
}
}
else if($newW !="" && $newH != "")
{
if($tempW > $newW)
{
if($newW >$oldW)
{
$dims = resizeBoundary($oldW, $oldH,$oldW,'');
$finalH = $dims['height'];
$finalW = $dims['width'];
}
else
{
$finalH = $tempH;
$finalW = $newW;
}
}
else
{
if($newH >$oldH)
{
$dims = resizeBoundary($oldW, $oldH,'',$oldH);
$finalH = $dims['height'];
$finalW = $dims['width'];
}
else
{
$finalH = $newH;
$finalW = $tempW;
}
}
}
$dims['height'] = $finalH;
$dims['width'] = $finalW;
return $dims;
}
// ví dụ nếu bạn muốn resize lại hình nào thì làm như sau :
resizeImage('test/computer.jpg','test/thumb/computer.jpg','200','200');
?>
Hàm thực thi trong đoạn code trên là function resizeImage($sourceFile,$destFile,$width,$height), mình xin giải thích các tham số như sau :
– $sourceFile : Đường dẫn đến file hình của bạn
– $destFile : Đường đẫn đến vị trí mà bạn muốn lưu sau khi resize bao gồm tên đường đẫn và tên hình ( ví dụ test/thumb/computer.jpg) trong đó test/thumb là đường dẫn.
– $width : chiều rộng cần thu nhỏ
– $height: chiều cao cần thu nhỏ
Hy vọng đoạn code trên sẽ giúp ích cho các bạn nhiều