@teplyashin

Почему искажается превью в php?

Всем доброго дня! будьте добры, подскажите как это вылечить, есть картинка , я ее режу под свои параметры, а потом делаю с нее превьюшки, но у меня качество падает от уровня к уровню.
$current = file_get_contents($tarLink);
            
            $bgColor = array(255, 255, 255);

            $im = imagecreatefromstring($current);
            $width = imagesx($im);
            $height = imagesy($im);

            if ($width > 500 || $height > 500) {
                $cropped = imagecropauto($im, IMG_CROP_SIDES);
                $widthCrop = imagesx($cropped);
                $heightCrop = imagesy($cropped);
                if ($widthCrop >= 500 || $heightCrop >= 500) {
                    $maxSize = max($widthCrop, $heightCrop);
                    $minSize = min($widthCrop, $heightCrop);
                    $kw = $widthCrop / $maxSize;
                    $kh = $heightCrop / $maxSize;
                    $k = $kw > $kh ? $kw : $kh;

                    $newImg = imagecreatetruecolor($maxSize, $maxSize - 40);
                    $bg = imagecolorallocate($newImg, $bgColor[0], $bgColor[1], $bgColor[2]);
                    imagefill($newImg, 0, 0, $bg);
                    if ($k > 1) {
                        $newWidth = (int) ($widthCrop / $k);
                        $newHeight = (int) ($heightCrop / $k);
                    } else {
                        $newWidth = $widthCrop;
                        $newHeight = $heightCrop;
                    }
                    $left = (int) (($maxSize - $newWidth) / 2);
                    $top = (int) (($maxSize - $newHeight) / 2);
                    //---------получаю обрезанное изображение готовое--------------------
                    imagecopyresampled($newImg, $cropped, $left, $top, 0, 0, $newWidth, $newHeight, $widthCrop, $heightCrop);
                    $newsImgs = $newImg;
                    //---------создаю на сайте оригинальное изображение без маски----------------------
                    imagejpeg($newImg, __DIR__ . $val . '/11original_unembossed.jpg');
                    imagewebp($newImg, __DIR__ . $val . '/11original_unembossed.webp');
                    
                    //--------получаю вотермарк и накладываю его на изображение обрезанного оригинала------------------
                    $img480 = imagescale($newImg, 480);
                    imagejpeg($img480, __DIR__ . $val . '/11480.jpg');
                    imagewebp($img480, __DIR__ . $val . '/11480.webp');
                    imagedestroy($img480);
                    $img240 = imagescale($newImg, 240);
                    imagejpeg($img240, __DIR__ . $val . '/11240.jpg');
                    imagewebp($img240, __DIR__ . $val . '/11240.webp');
                    imagedestroy($img240);
                    $img90 = imagescale($newImg, 90);
                    imagejpeg($img90, __DIR__ . $val . '/1190.jpg');
                    imagewebp($img90, __DIR__ . $val . '/1190.webp');
                    imagedestroy($img90);


                    // header('Content-Type: image/jpeg');
                    // imagejpeg($img90, NULL, 100);
                    
                        $watermMask = __DIR__  . "/img/watermark-2015.png";
                        $stamp = imagecreatefrompng($watermMask);
                        $sx = imagesx($stamp);
                        $sy = imagesy($stamp);
                        imagecopy($newsImgs, $stamp, (imagesx($newsImgs)/2) - ($sx/2), (imagesy($newsImgs)/2) - ($sy/2), 0, 0, imagesx($stamp), imagesy($stamp));
                        imagejpeg($newsImgs, __DIR__ . $val . '/11original.jpg');
                         imagewebp($newsImgs, __DIR__ . $val . '/11original.webp');
                         imagedestroy($newsImgs);

вот собственно фото , оригинал , 480 и 240 px6128e8c44d315880266701.jpeg6128e8cd3d05c123359754.jpeg6128e8d414d76853134399.jpeg
  • Вопрос задан
  • 678 просмотров
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Не вижу тут какой-то жуткой потери качества. Растровые изображения, вообще говоря, невозможно уменьшить идеально. Это всегда компромисс между плавным цветом без явной пикселизации и артефактов (ценой некоторого заблюривания и потери деталей) и сохранением деталей, четких краев и цветовых переходов (ценой вылазящих артефактов). Попробуйте в фотошопе добиться хорошего результата для произвольной картинки.
Нормально скейлятся только векторные изображения (и то на малом размере будут проблемы вписать их в пиксельную сетку).

Что касается PHP, gd поддерживает кучу разных алгоритмов интерполяции (вторым параметром к imagescale). Потестируйте, что лучше сработает именно в вашем случае.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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