Функция cot_imageresize в Cotonti

Функция cot_imageresize служит для изменения размера изображения. Она поддерживает опции обрезки, задания фона для прозрачных изображений, а также настройки качества и коррекции резкости для JPEG.


/**
 * Resize an image
 *
 * @param string $source Original image path.
 * @param string $target Target path for saving, or 'return' to return the resized image data directly.
 * @param int $target_width Maximum width of resized image.
 * @param int $target_height Maximum height of resized image.
 * @param string $crop Crop the image to a certain ratio. Set to 'fit' to calculate ratio from target width and height.
 * @param string $fillcolor Color fill a transparent gif or png.
 * @param int $quality JPEG quality
 * @param bool $sharpen Sharpen JPEG image after resize.
 * @return mixed Boolean or image resource, depending on $target
 */
function cot_imageresize(
    $source,
    $target = 'return',
    $target_width = 99999,
    $target_height = 99999,
    $crop = '',
    $fillcolor = '',
    $quality = 90,
    $sharpen = true
) {
    if (!file_exists($source)) {
        return false;
    }
    $source_size = getimagesize($source);
    if (!$source_size) {
        return false;
    }
    $mimetype = $source_size['mime'];
    if (substr($mimetype, 0, 6) != 'image/') {
        return false;
    }

    $source_width = $source_size[0];
    $source_height = $source_size[1];
    $noscaling_x = false;
    $noscaling_y = false;
    if ($target_width > $source_width) {
        $target_width = $source_width;
        $noscaling_x = true;
    }
    if ($target_height > $source_height) {
        $target_height = $source_height;
        $noscaling_y = true;
    }

    $fillcolor = preg_replace('/[^0-9a-fA-F]/', '', (string) $fillcolor);
    if (!$fillcolor && $noscaling_x && $noscaling_y) {
        $data = file_get_contents($source);
        if ($target == 'return') {
            return $data;
        }
    }

    $offsetX = 0;
    $offsetY = 0;

    if ($crop) {
        $crop = ($crop == 'fit') ? array($target_width, $target_height) : explode(':', (string) $crop);
        if (count($crop) == 2) {
            $source_ratio = $source_width / $source_height;
            $target_ratio = (float) $crop[0] / (float) $crop[1];

            if ($source_ratio < $target_ratio) {
                $temp = $source_height;
                $source_height = (int) ($source_width / $target_ratio);
                $offsetY = (int) (($temp - $source_height) / 2);
            }
            if ($source_ratio > $target_ratio) {
                $temp = $source_width;
                $source_width = (int) ($source_height * $target_ratio);
                $offsetX = (int) (($temp - $source_width) / 2);
            }
        }
    }

    $width_ratio = $target_width / $source_width;
    $height_ratio = $target_height / $source_height;
    if ($width_ratio * $source_height < $target_height) {
        $target_height = (int) ceil($width_ratio * $source_height);
    } else {
        $target_width = (int) ceil($height_ratio * $source_width);
    }

    // Avoid loading images there's not enough memory for
    if (!cot_img_check_memory($source, (int) ceil($target_width * $target_height * 4 / 1048576))){
        return false;
    }

    $canvas = imagecreatetruecolor($target_width, $target_height);

    switch ($mimetype) {
        case 'image/gif':
            $fn_create = 'imagecreatefromgif';
            $fn_output = 'imagegif';
            $mimetype = 'image/gif';
            //$quality = round(10 - ($quality / 10));
            $sharpen = false;
        break;

        case 'image/x-png':
        case 'image/png':
            $fn_create = 'imagecreatefrompng';
            $fn_output = 'imagepng';
            $quality = round(10 - ($quality / 10));
            $sharpen = false;
        break;

        default:
            $fn_create = 'imagecreatefromjpeg';
            $fn_output = 'imagejpeg';
            $sharpen = ($target_width < 75 || $target_height < 75) ? false : $sharpen;
        break;
    }
    $source_data = $fn_create($source);

    if (in_array($mimetype, array('image/gif', 'image/png'))) {
        if (!$fillcolor) {
            imagealphablending($canvas, false);
            imagesavealpha($canvas, true);

        } elseif (strlen($fillcolor) == 6 || strlen($fillcolor) == 3) {
            $background    = (strlen($fillcolor) == 6) ?
                imagecolorallocate(
                    $canvas,
                    hexdec($fillcolor[0].$fillcolor[1]),
                    hexdec($fillcolor[2].$fillcolor[3]),
                    hexdec($fillcolor[4].$fillcolor[5])
                ):
                imagecolorallocate(
                    $canvas,
                    hexdec($fillcolor[0].$fillcolor[0]),
                    hexdec($fillcolor[1].$fillcolor[1]),
                    hexdec($fillcolor[2].$fillcolor[2])
                );
            imagefill($canvas, 0, 0, $background);
        }
    }
    imagecopyresampled(
        $canvas,
        $source_data,
        0,
        0,
        $offsetX,
        $offsetY,
        $target_width,
        $target_height,
        $source_width,
        $source_height
    );
    imagedestroy($source_data);
    $canvas = ($sharpen) ? cot_imagesharpen($canvas, $source_width, $target_width) : $canvas;

    if ($target == 'return') {
        ob_start();
        $fn_output($canvas, null, $quality);
        $data = ob_get_contents();
        ob_end_clean();
        imagedestroy($canvas);
        return $data;

    } else {
        $result = $fn_output($canvas, $target, $quality);
        imagedestroy($canvas);
        return $result;
    }
}


Параметры функции:
$source — путь к исходному изображению.
$target — путь для сохранения изображения или 'return', если нужно вернуть данные изображения вместо записи в файл.
$target_width — максимальная ширина для нового изображения.
$target_height — максимальная высота для нового изображения.
$crop — опция для обрезки изображения. Может быть задано как 'fit' для автоматического подбора пропорций или как соотношение (например, '16:9').
$fillcolor — цвет фона для прозрачных изображений (например, для GIF или PNG).
$quality — качество JPEG (от 0 до 100).
$sharpen — флаг, указывающий, нужно ли увеличивать резкость изображения.
Логика работы функции:
Проверка существования файла: Функция проверяет, существует ли файл по пути $source. Если файл не найден, возвращается false.

Определение типа изображения: С помощью getimagesize получаем информацию о размере и типе изображения. Если изображение не является изображением (например, файл не картинка), функция также вернёт false.

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

Обрезка изображения: Если задан параметр $crop, изображение будет обрезано до указанных пропорций или размеров. Это позволяет получить изображение в нужном формате (например, 16:9) при изменении размеров.

Масштабирование: Исходя из пропорций целевой ширины и высоты, рассчитываются новые размеры для изображения.

Память: Функция проверяет, есть ли достаточно памяти для обработки изображения с новыми размерами.

Создание холста: Используется функция imagecreatetruecolor для создания нового холста с нужными размерами.

Обработка различных форматов изображений: В зависимости от типа изображения (GIF, PNG, JPEG) выбираются соответствующие функции для чтения и записи изображения. Применяются дополнительные параметры (например, для PNG изображений используется альфа-канал, для JPEG устанавливается качество).

Запись или возврат изображения: Если параметр $target равен 'return', изображение будет отправлено в выходной поток и возвращено как данные. В противном случае, изображение сохраняется в файл по пути $target.

Коррекция резкости: Если параметр $sharpen установлен в true, изображение будет обработано для улучшения резкости (для маленьких изображений эта операция может быть отключена).

Пример использования:
Пример №1:

cot_imageresize($filepath, $filepath, $settings['width'], $settings['height'], $settings['crop'], '', 100);

Здесь:

$filepath — путь к изображению, как исходный, так и целевой.
$settings['width'] и $settings['height'] — целевые размеры для изображения.
$settings['crop'] — параметр, который может быть установлен для обрезки изображения.


Пример №2:

cot_imageresize(
    $pfs_dir_user . $u_newname,
    $thumbs_dir_user . $u_newname,
    Cot::$cfg['pfs']['th_x'],
    Cot::$cfg['pfs']['th_y'],
    '',
    $th_colorbg,
    Cot::$cfg['pfs']['th_jpeg_quality'],
    true
);


Здесь:

$pfs_dir_user . $u_newname — исходный путь к изображению.
$thumbs_dir_user . $u_newname — путь для сохранения изменённого изображения.
Cot::$cfg['pfs']['th_x'] и Cot::$cfg['pfs']['th_y'] — целевые размеры для миниатюры.
$th_colorbg — цвет фона для прозрачных изображений.
Cot::$cfg['pfs']['th_jpeg_quality'] — качество JPEG.
true — флаг для коррекции резкости.


Возвращаемые значения:


Если $target задан как 'return', функция возвращает данные изображения в виде строки.
Если $target задан как путь, то изображение сохраняется в файл и возвращается булевое значение (истина, если операция прошла успешно, ложь — если произошла ошибка).


Примечание:


Для обработки изображений используется несколько стандартных функций PHP (imagecreatefromgif, imagecreatefrompng, imagecreatefromjpeg), и она работает с изображениями форматов GIF, PNG и JPEG.

6 минут чтения Administrator

Комментарии (0)

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

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 22.01.2025 00:59
  • Последнее обновление: 22.01.2025 01:01