Laravel снижает качество изображения, загружая amazon s3

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

public static function uploadToAmazon($photos, $ad_id)
{

    // Start Uploading to Amazon Cloud
    try {

        // Set loop couter
        $counter = 0;

        // Count photos
        $count_photos      = count($photos);

        // Manage each image
        foreach ($photos as $photo) {

            $preview_name   = 'preview_'   . $counter . '.jpg';
            $thumbnail_name = 'thumbnail_' . $counter . '.jpg';

            $image = Image::make($photo->getRealPath());

            // Get Ration
            $ratio        = $image->width() / $image->height();

            /**
            * Upload first thumbnails
            */
            $targetThumbWidth  = 270 * $ratio;
            $targetThumbHeight = $targetThumbWidth / $ratio;

            // Resize Thumbnail
            $thumbNewSize      = $image->fit($targetThumbWidth, $targetThumbHeight)->stream();

            Storage::disk('s3')->put('photos/'.$ad_id.'/thumbnails/'.$thumbnail_name, $thumbNewSize->__toString());
            Storage::disk('s3')->setVisibility('photos/'.$ad_id.'/thumbnails/'.$thumbnail_name, 'public');

            /**
            * Now upload Preview images
            */
            $resposniveSize = Uploader::resposniveSize($image->width(), $image->height());

            // Resize Thumbnail
            $previewNewSize      = $image->fit($resposniveSize[0], $resposniveSize[1])->stream();

            // Check if Watermark enabled or not
            $is_watermark   = Uploader::is_watermark();

            if ($is_watermark) {

                // Get Watermark Options
                $watermark = $is_watermark['watermark'];
                $position  = $is_watermark['position'];

                // Insert Watermark
                $image->insert($watermark, $position);

            }

            Storage::disk('s3')->put('photos/'.$ad_id.'/previews/'.$preview_name, $previewNewSize->__toString());
            Storage::disk('s3')->setVisibility('photos/'.$ad_id.'/previews/'.$preview_name, 'public');

            // New Counter
            $counter ++;

        }

        if ($counter == $count_photos){

            // Return Previews Array
            $previews_array   = array();

            // Return Thumbnails Array
            $thumbnails_array = array();

            for ($i = 0 ; $i <= $count_photos - 1 ; $i++) { 

                array_push($previews_array, '/'.$ad_id.'/previews/preview_'.$i.'.jpg');
                array_push($thumbnails_array, '/'.$ad_id.'/thumbnails/thumbnail_'.$i.'.jpg');

            }

            // Return Data
            $data  = array(
                'previews_array'   => $previews_array, 
                'thumbnails_array' => $thumbnails_array, 
            );

            return $data;

        }else{

            return false;

        }

    } catch (\Exception $e) {

        /*echo $e->getMessage();
        die();*/
        return false;

    }

}

Правда что то не могу найти момент в котором изображение теряет качество, будет ресайзить?

Это оригинальная картинка Laravel снижает качество изображения, загружая amazon s3

Это изображение, которое есть в amazon s3 Laravel снижает качество изображения, загружая amazon s3

public static function resposniveSize($originalWidth, $originalHeight)
{
    // Get Ration
    $ratio        = $originalWidth / $originalHeight;

    // New Width
    $targetWidth  = intval(500 * $ratio);

    // New Height
    $targetHeight = intval($targetWidth / $ratio);

    return array($targetWidth, $targetHeight);
}

Что делает функция Uploader::resposniveSize?

Steffan Venema 13.02.2019 15:48

Я добавил функцию, которую вы просили

josedaian 13.02.2019 18:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
334
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Итак, вместо использования:

$thumbNewSize = $image->fit($targetThumbWidth, $targetThumbHeight)->stream();

Попробуйте использовать это:

$thumbNewSize = $image;
$thumbNewSize->fit($targetThumbWidth, $targetThumbHeight)->stream();

То же самое касается $previewNewSize.

Вы также можете попробовать использовать ->resize($targetThumbWidth, $targetThumbHeight) вместо ->fit()

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

josedaian 13.02.2019 16:04

Вы можете попробовать использовать ->resize($targetThumbWidth, $targetThumbHeight) вместо ->fit()

Steffan Venema 13.02.2019 16:19

Я пробовал, безуспешно, я не нахожу ошибку или что я делаю неправильно

josedaian 13.02.2019 18:03

Большое спасибо, я изменил порядок, в котором это выполнялось, и это сработало. По какой-то причине, сколько бы я ни вставлял разные переменные, я пытался увеличить изображение, которое сначала было уменьшено, так что качество упало.

josedaian 13.02.2019 19:01

Другие вопросы по теме