Не верный рассчет соотношения сторон? Скрипт для того, чтобы привести все изображения к единому соотношению сторон без растяжения (наложение на белый фон) Но, почему-то на деле имеется погрешность в несколько пикселей в соотношении сторон. Как её исправить?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);
Для исправления погрешности в соотношении сторон можно использовать следующую стратегию:
Округлить значения ширины и высоты до целых чисел перед вычислением новых размеров изображения.После вычисления новых размеров снова проверить соотношение сторон и при необходимости скорректировать их.
Для исправления погрешности в соотношении сторон можно использовать следующую стратегию:
Округлить значения ширины и высоты до целых чисел перед вычислением новых размеров изображения.После вычисления новых размеров снова проверить соотношение сторон и при необходимости скорректировать их.Измененный код будет выглядеть так:
$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);
Применяя округление к значениям высоты и ширины до целых чисел, вы сможете избежать погрешности в расчетах соотношения сторон вашего изображения.