Не верный рассчет соотношения сторон? Скрипт для того, чтобы привести все изображения к единому соотношению сторон без растяжения (наложение на белый фон)
Но, почему-то на деле имеется погрешность в несколько пикселей в соотношении сторон. Как её исправить?readImage('/var/www/localhost/files/images/'.$fnamefoto);
$img->setImageFormat('jpeg');
$val = $img->getImageWidth() / $img->getImageHeight();
if ($val > 1.77272727273) {
$height = intval($img->getImageHeight() + ($img->getImageHeight() * ($val - 1.77272727273)));
$width = $img->getImageWidth();
} else {
$width = intval($img->getImageWidth() + ($img->getImageWidth() * (1.77272727273 - $val)));
$height = $img->getImageHeight();
}
$canvas = new Imagick();
$canvas->newImage($width, $height, 'white', 'jpg');
$geometry = $img->getImageGeometry();
$x = ($width - $geometry['width']) / 2;
$y = ($height - $geometry['height']) / 2;
$canvas->compositeImage($img, imagick::COMPOSITE_OVER, $x, $y);
$canvas->writeImage('/var/www/localhost/files/images/'.$fnamefoto);

21 Авг 2019 в 06:16
280 +1
1
Ответы
1

Для исправления погрешности в соотношении сторон можно использовать следующую стратегию:

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

Измененный код будет выглядеть так:

$fnamefoto = $_GET['name'];
$img = new Imagick();
$img->readImage('/var/www/localhost/files/images/'.$fnamefoto);
$img->setImageFormat('jpeg');
$val = $img->getImageWidth() / $img->getImageHeight();
$width = $img->getImageWidth();
$height = $img->getImageHeight();
if ($val > 1.77272727273) {
$height = round($height + ($height * ($val - 1.77272727273)));
} else {
$width = round($width + ($width * (1.77272727273 - $val)));
}
$canvas = new Imagick();
$canvas->newImage($width, $height, 'white', 'jpg');
$geometry = $img->getImageGeometry();
$x = ($width - $geometry['width']) / 2;
$y = ($height - $geometry['height']) / 2;
$canvas->compositeImage($img, Imagick::COMPOSITE_OVER, $x, $y);
$canvas->writeImage('/var/www/localhost/files/images/'.$fnamefoto);

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

20 Апр 2024 в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир