Функция 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.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 22.01.2025 00:59
- Последнее обновление: 22.01.2025 01:01