2015-12-18 4 views
2

В моем веб-приложении Laravel я использую Intervention Image library. Я сохраняю три версии загруженного изображения: 'original', '500_auto' и изображение нестандартного размера.Laravel Image Intervention изменяет размер потери качества

$image = Image::make(Input::file('file'); 

// Save the orignal image 
$image->save($folder . 'original.' . $extension); 

// Save 500_auto image 
$image->resize(500, null, function($constraint) { 
    $constraint->aspectRatio(); 
}); 
$image->save($folder . '500_auto.' . $extension, 100); 

// Check if size is set 
if (isset($config->images->width) && isset($config->images->height)) { 
    // Assign values 
    $width = $config->images->width; 
    $height = $config->images->height; 
    // Create the custom thumb 
    $image->resize($width, $height, function($constraint) { 
     $constraint->aspectRatio(); 
    }); 
    $image->save($folder . $width . '_' . $height . '.' . $extension, 100); 
} 

Водитель вмешательства устанавливается в конфигурации, как 'gd':

'driver' => 'gd' 

Это изображение я загрузки: original.jpg

Original image

И это результат из пользовательского большого пальца с настройками конфигурации, установленными для точных исходных размеров (1800 x 586): 1800_586.jpg

Resized image

Как вы можете увидеть второе изображение есть много потерь качества в измененном изображении. Как я могу это исправить?

ответ

5

Сначала вы меняете размер изображения на небольшой формат, затем вы берете небольшое изображение и изменяете его размер до первоначального размера. Если вы отмените заказ, вы перейдете от исходного размера -> оригинального размера -> небольшого размера.

Лично я обычно предпочитаю повторять вызов Image::make() для каждого нового изображения, просто чтобы убедиться, что я не виню что-то подобное на этом пути.

+0

Спасибо за вашу помощь. Очень логично, что он изменил размер до небольшой версии и изменил размер до 1800х586 после этого. Я обновил метод, напомнив изображение :: make() перед каждым изменением размера, как и вы упомянули. – guuspor

+0

Добро пожаловать. Я рад, что это помогло. :) –

+0

Хорошая строка для создания нового 'Image :: make()' для каждого изменения размера. Вот почему причиной размытия изображения является функция изменения размера. –

3

Вы можете использовать «резервное копирование()» метод, чтобы сохранить состояние объекта и «сбросу()» метод, чтобы вернуться обратно в резервное состоянии:

// create an image 
$img = Image::make('public/foo.jpg'); 

// backup status 
$img->backup(); 

// perform some modifications 
$img->resize(320, 240); 
$img->invert(); 
$img->save('public/small.jpg'); 

// reset image (return to backup state) 
$img->reset(); 

// perform other modifications 
$img->resize(640, 480); 
$img->invert(); 
$img->save('public/large.jpg'); 

подробнее на этой странице: http://image.intervention.io/api/reset