PHP Изменение размера загруженного изображения в Specifi c Размеры без обрезки - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время у меня есть скрипт, в котором пользователи могут загружать файлы изображений любых размеров. Загруженное изображение отправляется с помощью ajax в сценарий PHP, где оно должно быть изменено и сохранено на сервере. Процесс изменения размера не должен обрезать или искажать изображение, а скорее изменять его размер до определенного размера c, добавляя белый цвет по бокам или сверху / снизу, если он не совсем соответствует размерам. У меня этот процесс отлично работает для квадратного изображения, но при попытке изменить процесс для работы с размерами прямоугольника он больше не работает правильно.

                 $sourceImage = imagecreatefromjpeg("../img/whiteBG.jpg");
                 $dimensions = getimagesize($files["tmp_name"][$i]);
                 $ratio = $dimensions[0] / $dimensions[1]; // width/height

                 $dst_y = 0;
                 $dst_x = 0;

                 //final image should be 600x360
                 if ($ratio > 1) {
                        $width = 600;
                        $height = 360 / $ratio;
                        $dst_y = (360 - $height) / 2;
                 } else {
                        $width = 600 * $ratio;
                        $height = 360;
                        $dst_x = (600 - $width) / 2;
                 }

                 $src = imagecreatefromstring(file_get_contents($files["tmp_name"][$i]));
                 $dst = imagecreatetruecolor($width, $height);
                 imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $dimensions[0], $dimensions[1]);

                 imagecopymerge($sourceImage, $dst, $dst_x, $dst_y, 0, 0, imagesx($dst), imagesy($dst), 100);
                 $moved = imagepng($sourceImage, $dir . $filename);

Выводимое изображение ($ Move) должно иметь окончательные размеры 600 х 360. Вместо этого, окончательное изображение всегда искажается. Если загружено высокое соотношение изображения, конечный продукт будет растянут по ширине. Если загружено более широкое соотношение изображений, оно сжимается и выравнивается с дополнительным верхним и нижним интервалом. whiteBG.jpg - просто белый jpeg с размерами 600x360

1 Ответ

0 голосов
/ 21 апреля 2020

Закончилось исправление этого. Вопрос заключался в том, как я рассчитывал и компенсировал крысу ios. Это был последний код, который исправил проблему с переменными, чтобы сделать код более универсальным для других ситуаций

             $targetWidth = 600;
             $targetHeight = 360;
             $dstY = 0;
             $dstX = 0;
             $ratioFactor = 0;

             $bgImage = imagecreatefromjpeg("../img/bgWhite.jpg");
             $dimensions = getimagesize($files["tmp_name"][$i]);
             $sourceWidth = $dimensions[0];
             $sourceHeight = $dimensions[1];
             $ratio = $sourceWidth / $sourceHeight; // width/height

             //final image should be 600x360
             if ($ratio > 1) {
                    $ratioFactor = $sourceWidth / $targetWidth;
                    $targetHeight = $sourceHeight / $ratioFactor;
                    $dstY = (360 - $targetHeight) / 2;
             } else {
                    $ratioFactor = $sourceHeight / $targetHeight;
                    $targetWidth = $sourceWidth / $ratioFactor;
                    $dstX = (600 - $targetWidth) / 2;
             }

             $source = imagecreatefromstring(file_get_contents($files["tmp_name"][$i]));
             $target = imagecreatetruecolor($targetWidth, $targetHeight);
             imagecopyresampled($target, $source, 0, 0, 0, 0, $targetWidth, $targetHeight, $sourceWidth, $sourceHeight);

             imagecopymerge($bgImage, $target, $dstX, $dstY, 0, 0, imagesx($target), imagesy($target), 100);
             imagepng($bgImage, $dir . $filename);
...