Функция PHP для создания уменьшенной копии изображения (resize)
Несмотря на богатство набора функций, предоставляемых в PHP для работы с изображениями, простого инструмента для создания уменьшенных копий-превьюшек среди них нет. Предлагаемая функция позволяет решать эту задачу в одно действие.
Функция работает с изображениями формата GIF, JPEG и PNG (при желании можно расширить этот список, насколько это позволяет библиотека GD, на основе которой построена работа предлагаемой функции). В качестве входных аргументов она принимает:
- путь к исходному изображению
- путь к будущей маленькой копии (включая имя файла)
- ширину копии
- высоту копии
- качество для изображений в формате jpeg: 0 - 100, по умолчанию - 75 (подробнее см. руководство функции imagejpeg() на php.net)
При желании высоту можно не передавать — функция сама рассчитает её и сделает изображение тех же пропорций, что и исходное. Если передать нулевую ширину — также будет сделано изображение тех же пропорций, но уже на основании высоты:
image_resize($imgpath, $preview, 100); // будет создано изображение $preview 100х75
image_resize($imgpath, $preview, 0, 100); // а так $preview получится 133х100
Если пропорции переданных ширины и высоты отличаются от исходных, новое изображение окажется искажено, поэтому лучше использовать один из вышеперечисленных вариантов.
Также нужно озаботиться тем, чтобы исходный файл уже существовал (при обращении к несуществующему файлу функция сгенерирует warning), и чтобы у веб-сервера имелись права на запись в то место, куда хочется поместить уменьшенную копию (иначе также будет warning).
Для jpeg-изображений функция выполняет чересстрочное формирование, благодаря чему изображение создаётся в формате progressive JPEG и начинает отображаться в браузере до окончания полной загрузки с постепенным увеличением качества (подробнее см., например, на php.net).
Ниже приводится непосредственно код функции.
$source_path,
$destination_path,
$newwidth,
$newheight = FALSE,
$quality = FALSE // качество для формата jpeg
) {
ini_set("gd.jpeg_ignore_warning", 1); // иначе на некотоых jpeg-файлах не работает
list($oldwidth, $oldheight, $type) = getimagesize($source_path);
switch ($type) {
case IMAGETYPE_JPEG: $typestr = 'jpeg'; break;
case IMAGETYPE_GIF: $typestr = 'gif' ;break;
case IMAGETYPE_PNG: $typestr = 'png'; break;
}
$function = "imagecreatefrom$typestr";
$src_resource = $function($source_path);
if (!$newheight) { $newheight = round($newwidth * $oldheight/$oldwidth); }
elseif (!$newwidth) { $newwidth = round($newheight * $oldwidth/$oldheight); }
$destination_resource = imagecreatetruecolor($newwidth,$newheight);
imagecopyresampled($destination_resource, $src_resource, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight);
if ($type = 2) { # jpeg
imageinterlace($destination_resource, 1); // чересстрочное формирование изображение
imagejpeg($destination_resource, $destination_path, $quality);
}
else { # gif, png
$function = "image$typestr";
$function($destination_resource, $destination_path);
}
imagedestroy($destination_resource);
imagedestroy($src_resource);
}
© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.