Я загружаю изображения с права на 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;
}
}
Правда что то не могу найти момент в котором изображение теряет качество, будет ресайзить?
Это изображение, которое есть в 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);
}
Я добавил функцию, которую вы просили






Проблема, с которой вы столкнулись, заключается в том, что вы сначала изменяете размер изображения до размера миниатюры. После чего вы масштабируете его до размера предварительного просмотра. Это приводит к потере качества.
Итак, вместо использования:
$thumbNewSize = $image->fit($targetThumbWidth, $targetThumbHeight)->stream();
Попробуйте использовать это:
$thumbNewSize = $image;
$thumbNewSize->fit($targetThumbWidth, $targetThumbHeight)->stream();
То же самое касается $previewNewSize.
Вы также можете попробовать использовать ->resize($targetThumbWidth, $targetThumbHeight) вместо ->fit()
Я применил предложенное вами изменение и получил те же результаты, изображение продолжает терять качество.
Вы можете попробовать использовать ->resize($targetThumbWidth, $targetThumbHeight) вместо ->fit()
Я пробовал, безуспешно, я не нахожу ошибку или что я делаю неправильно
Большое спасибо, я изменил порядок, в котором это выполнялось, и это сработало. По какой-то причине, сколько бы я ни вставлял разные переменные, я пытался увеличить изображение, которое сначала было уменьшено, так что качество упало.
Что делает функция
Uploader::resposniveSize?