Laravel снижает качество изображения, загружая amazon s3 - PullRequest
0 голосов
/ 13 февраля 2019

Я загружаю изображения справа на 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;

    }

}

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

Это оригинальное изображение enter image description here

Это изображение, которое находится в Амазонке s3 enter image description here

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);
}

1 Ответ

0 голосов
/ 13 февраля 2019

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

Поэтому вместо использования:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...