Резайз картинок в PHP

8 Фев
2010

Недавно встала задача, упростить работу контент менеджера. Задача заключалось в том, чтобы ему не приходилось создавать превьюшки для вставляемых картинок. В результате поисков, был найден неплохой скрипт, который очень помогает в этом.

Под катом, сам скрипт и пример использования.

Вот, для начала, код скрипта:

/**
	Функция изменяет размер изображения,
	 если передать вместо ширины/высоты 0, то размер изменится пропорционально

	@param string полный путь к файлу изображения
	@param string путь для нового изображения
	@param int    ширина
	@param int    высота
	@param string цвет фона, если (останется свободное место)
	@param int    качество на выходе в %

	@return boolean */
function img_resize($src, $out, $width, $height, $color = 0xFFFFFF, $quality = 100)
{
    // Если файл не существует
    if (!file_exists($src)) {
        return false;  // Выходим из функции
    }

    // Получаем массив с информацией о размере и формате картинки (mime)
    $size = getimagesize($src);
    // Исходя из формата (mime) картинки, узнаем с каким форматом имеем дело
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
    //и какую функцию использовать для ее создания
    $picfunc = 'imagecreatefrom'.$format;

    // Вычилсить горизонтальное соотношение
    $gor = $width  / $size[0];
    // Вертикальное соотношение
    $ver = $height / $size[1];  

    // Если не задана высота, вычислить исходя из ширины, пропорционально
    if ($height == 0) {
        $ver = $gor;
        $height  = $ver * $size[1];
    }
	// Если же не задана ширина, вычислить ее исходя из высоты, пропорционально
	elseif ($width == 0) {
        $gor = $ver;
        $width   = $gor * $size[0];
    }

    // Формируем размер изображения
    $ratio   = min($gor, $ver);
    // Нужно ли пропорциональное преобразование
    if ($gor == $ratio)
        $use_gor = true;
    else
        $use_gor = false;

    $new_width   = $use_gor  ? $width  : floor($size[0] * $ratio);
    $new_height  = !$use_gor ? $height : floor($size[1] * $ratio);
    $new_left    = $use_gor  ? 0 : floor(($width - $new_width)   / 2);
    $new_top     = !$use_gor ? 0 : floor(($height - $new_height) / 2);

    $picsrc  = $picfunc($src);
    // Создание изображения в памяти
    $picout = imagecreatetruecolor($width, $height);

    // Заполнение цветом
    imagefill($picout, 0, 0, $color);
    // Нанесение старого на новое
    imagecopyresampled($picout, $picsrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);

    // Создание файла изображения
    imagejpeg($picout, $out, $quality);

    // Очистка памяти
    imagedestroy($picsrc);
    imagedestroy($picout);

    return true;
}

Теперь пример использования. Скрипт этот я использую в админке, при добавлении картинки к товару, скрипт создает для указанной картинки превьюшку.

/**@param int     Id Товара
@param string путь к большой картинке
@param string путь по которому будет сохранена превьюшка
@param string тип ресайза (по высоте - 'height' или по ширине - 'width')
@param int     новая ширина/высота (в зависимости от указанного в $imgResizeBy значения)
@param int    качество на выходе в %
*/
function makeGoodPreview( $id , $in , $out, $imgResizeBy , $imgResizeVal , $imgQuality ){
   // Обнуляем значения ширины/высоты
   $iWidth=$iHeight=0;
   // Определяем по какому направлению делать резайз (ширина/высота)
   if($imgResizeBy == 'width') $iWidth = $imgResizeVal;
   elseif($imgResizeBy == 'height') $iHeight = $imgResizeVal;
   // Если создание измененной картинки прошло успешно, то...
   if (img_resize($in, $out, $iWidth, $iHeight, 0xFFFFFF, $imgQuality))
       // ... обновляем информацию о товаре
       mysql_query("update `goods` set  `image`='".$imgPath."', `smallimage`='".$out."' where `id`=".$id.";");
}

Кстати, скрипт ресайзера не мой. Пытался вспомнить где его нашел, но безуспешно. Если автор найдется, поставлю автора скрипта.

Скачать скрипт можно по этой ссылке

2leep.com

Оставить комментарий или два

*

Наверх