@EpicUsaMan

Не верный рассчет соотношения сторон?

Скрипт для того, чтобы привести все изображения к единому соотношению сторон без растяжения (наложение на белый фон)

Но, почему-то на деле имеется погрешность в несколько пикселей в соотношении сторон. Как её исправить?
<?php
 
$fnamefoto = $_GET['name'];
$img = new Imagick();
$img->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);
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Как-то у вас чересчур сложно вычисляется всё.
$width = $img->getImageWidth();
$height = $img->getImageHeight();
if ($height*16 > $width*9) {
  $width = $height*16/9;
} else {
  $height = $width*9/16;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега PHP
Вы производите вычисления с плавающей точно, но потом округляете до целого, и так дважды. Вот вам и разница.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы