Как сделать превью изображения на лету

Эту статью я хочу посвятить нехитрому кодингу на php.  Кто разрабатывает сайты знает, что не эффективно сжимать стилями большие изображения до размеров превьюшек. Страница получится всё равно весомая, и её загрузка будет занимать время большее, чем если бы превьюшки были маленького размера. Так же в некоторых случаях я не вижу смысла плодить файлы маленьких изображений, являющимися превью больших изображений.

Предлагаю Вашему вниманию нехитрый код функции, которая на лету преобразует большое изображение в маленькое нужного размера:

function fly_fit_resize()
{ $width = $_GET[‘width’];
$height = $_GET[‘height’];
$link = $_GET[‘link’];
$fit_only = $_GET[‘fit_only’];
if(!is_numeric(trim($width)) OR !is_numeric(trim($height)) OR $width<0 OR $height<0)
{
echo "Ошибка размеров!";
return false;
}
$imgArgs = getimagesize($link); // получаю информацию о изображении
$imgSrcX = $imgArgs[0];
$imgSrcY = $imgArgs[1];
$imgSrcRatio = $imgSrcY / $imgSrcX; // соотношение размеров по ширине и высоте
if($fit_only == 'true')
{
if ($imgSrcX < $imgSrcY) // если у изображения "книжная" ориентация
{
$imgDestY = $height;
$imgDestX = ceil($imgDestY / $imgSrcRatio);
}
else
{
$imgDestX = $width;
$imgDestY = ceil($imgDestX * $imgSrcRatio);
}
}
else
{
if ($imgSrcX < $imgSrcY) // если у изображения "книжная" ориентация
{
$imgDestX = $width;
$imgDestY = ceil($imgDestX * $imgSrcRatio);
}
else
{
$imgDestY = $height;
$imgDestX = ceil($imgDestY / $imgSrcRatio);
if($imgDestX < $width)
{
$imgDestY = ceil($imgDestY*$width/$imgDestX);
$imgDestX = $width;
}
}
}
$destImg = imagecreatetruecolor($imgDestX, $imgDestY); // контейнер для уменьшенной копии
imagefilledrectangle($destImg, 0, 0, $imgDestX, $imgDestY, imagecolorallocate($destImg, 255, 255, 255)); //закраска белым фоном контейнера
switch ($imgArgs[2]) { // в зависимости от типа изображения, считываю его соответствующей функцией
case 1:
$srcImg = imagecreatefromgif($link);
break;
case 2:
$srcImg = imagecreatefromjpeg($link);
break;
case 3:
$srcImg = imagecreatefrompng($link);
break;
}
// если почему-то не удалось создать копию возвращается false
if (!imagecopyresampled($destImg, $srcImg, 0, 0, 0, 0, $imgDestX, $imgDestY, $imgSrcX, $imgSrcY)) return false;
$cropImg = imagecreatetruecolor($width, $height); // контейнер для кадрированного изображения
imagefilledrectangle($cropImg, 0, 0, $width, $height, imagecolorallocate($cropImg, 255, 255, 255)); //закраска белым фоном
if($fit_only == 'true')
{
$cx = $imgDestX / 2;
$cy = $imgDestY / 2;
$x = $width / 2 - $cx;
$y = $height / 2 - $cy;
// если не удалось откадрировать изображение, возвращается false
if (!imagecopy($cropImg, $destImg, $x, $y, 0, 0, $imgDestX, $imgDestY)) return false;
}
else
{
// вычисляю откуда резать, чтобы вырезался центр картинки
$cx = $imgDestX / 2;
$cy = $imgDestY / 2;
$x = $cx - $width / 2;
$y = $cy - $height / 2;
if ($x < 0) $x = 0;
if ($y < 0) $y = 0;
// если не удалось откадрировать изображение, возвращается false
if (!imagecopy($cropImg, $destImg, 0, 0, $x, $y, $width, $height)) return false;
}
imagedestroy($destImg); // уничтожаю уменьшенную копию
$types = array(1 => ‘gif’, 2 => ‘jpeg’, 3 => ‘png’);
$mime = (isset($types[$imgArgs[‘2’]])) ? ‘image/’.$types[$imgArgs[‘2’]] : ‘image/jpg’;
header(“Content-Disposition: filename={$link};”);
header(“Content-Type: {$mime}”);
header(‘Content-Transfer-Encoding: binary’);
header(‘Last-Modified: ‘.gmdate(‘D, d M Y H:i:s’, time()).’ GMT’);
switch ($imgArgs[2]) // в зависимости от типа изображения, выводим его соответствующей функцией
{
case 1:
imagegif($cropImg);
break;
case 2:
imagejpeg($cropImg);
break;
case 3:
imagepng($cropImg);
break;
}
imagedestroy($cropImg); // уничтожаю контейнер откадрированного изображения
return true;
}

Этой функции передаются четыре параметра. Ширина и высота, которые должны быть у обработанного изображения. Относительный путь к обрабатываемому изображению. И параметр “фитить” изображение или сделать вырезку для полного заполнения необходимого квадрата.
По этой ссылке Вы можете посмотреть работу скрипта. Также там выводится ссылка, по которой обрабатывается изображение, перейдя по которой Вы сможете поиграться передаваемыми GET параметрами.

Это решение не панацея, конечно, но лично я этим пользуюсь.
Эффективного Вам кодинга!

Комментарии

comments powered by HyperComments