Создание эскиза в Laravel с помощью библиотеки изображений вмешательства
На сайте мы всегда работаем с изображениями. В зависимости от требований мы используем разные версии изображений. Для разработчиков рекомендуется создавать разные версии, называемые миниатюрами одного изображения. Эти эскизы можно использовать при отображении изображений разных размеров в зависимости от размера контейнера. Отображение изображения, которое соответствует размеру контейнера, сэкономит трафик и сократит время загрузки страницы. Отображение изображения большого размера в небольшом контейнере – плохая практика и снижает время загрузки страницы. В результате рекомендуется создать несколько эскизов изображения и при необходимости использовать соответствующую версию.
В этой статье мы изучаем, как создать миниатюру в Laravel с помощью библиотеки Intervention Image. Intervention Image – бесплатная и одна из популярных библиотек для работы с изображениями. В фоновом режиме эта библиотека использует GD Library и Imagick для управления изображениями.
Для этого урока я создам 3 эскиза – маленький, средний, большой с размерами 150 93, 300 * 185, 550 340 соответственно. Измените эти размеры в соответствии с вашими требованиями.
Начиная
Для начала вам необходимо сначала установить библиотеку Intervention Image в Laravel. Откройте терминал в корневом каталоге вашего проекта и выполните следующую команду:
composer require intervention/image
После установки библиотеки откройте config/app.php
файл и добавьте в него следующие строки.
Добавьте поставщиков услуг для этого пакета в $providers
массив.
InterventionImageImageServiceProvider::class
Добавьте фасад в $aliases
массив.
'Image' => InterventionImageFacadesImage::class
Далее для хранения изображений нам нужно создать каталог. Подойдите к терминалу и выполните следующую команду:
php artisan storage:link
Эта команда создает каталог хранения (символическая ссылка) в общей папке. В эту папку я загружу исходное изображение и его миниатюры.
Создайте эскиз в Laravel
Мы все установили базовую настройку и теперь можем написать фактический код. Давайте создадим форму в вашем файле просмотра.
<form action="{{ url('PASS_ACTION_URL') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image" id="exampleInputFile">
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
В контроллере вам нужно добавить фасад библиотеки Image, который мы добавили в config/app.php
файл.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Image;
class ImageController extends Controller
{
}
Добавляя фасад, мы можем вызывать функции библиотеки Intervention Image. В приведенном ниже коде я загружу изображение в двух местах. Исходное изображение попадает прямо в storage/profile_images
папку. Миниатюры будут храниться в storage/profile_images/thumbnail
каталоге. Сначала мы загружаем исходное изображение в папку эскизов, а затем изменяем его размер.
public function store(Request $request)
{
if($request->hasFile('profile_image')) {
//get filename with extension
$filenamewithextension = $request->file('profile_image')->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $request->file('profile_image')->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.time().'.'.$extension;
//small thumbnail name
$smallthumbnail = $filename.'_small_'.time().'.'.$extension;
//medium thumbnail name
$mediumthumbnail = $filename.'_medium_'.time().'.'.$extension;
//large thumbnail name
$largethumbnail = $filename.'_large_'.time().'.'.$extension;
//Upload File
$request->file('profile_image')->storeAs('public/profile_images', $filenametostore);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $smallthumbnail);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $mediumthumbnail);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $largethumbnail);
//create small thumbnail
$smallthumbnailpath = public_path('storage/profile_images/thumbnail/'.$smallthumbnail);
$this->createThumbnail($smallthumbnailpath, 150, 93);
//create medium thumbnail
$mediumthumbnailpath = public_path('storage/profile_images/thumbnail/'.$mediumthumbnail);
$this->createThumbnail($mediumthumbnailpath, 300, 185);
//create large thumbnail
$largethumbnailpath = public_path('storage/profile_images/thumbnail/'.$largethumbnail);
$this->createThumbnail($largethumbnailpath, 550, 340);
return redirect('image')->with('success', "Image uploaded successfully.");
}
}
В приведенном выше коде я храню изображение в трех форматах: маленький, средний и большой. После их сохранения мы вызываем метод createThumbnail
и передаем ему требуемую ширину и высоту. Определим эту функцию ниже. Эта функция должна входить в тот же контроллер.
/**
* Create a thumbnail of specified size
*
* @param string $path path of thumbnail
* @param int $width
* @param int $height
*/
public function createThumbnail($path, $width, $height)
{
$img = Image::make($path)->resize($width, $height, function ($constraint) {
$constraint->aspectRatio();
});
$img->save($path);
}
Здесь мы пропорционально изменяем размер изображения. При этом мы сохраняем соотношение сторон, и изображение не будет обрезано.
Если вы ищете жесткий урожай, замените строки ниже
$img = Image::make($path)->resize($width, $height, function ($constraint) {
$constraint->aspectRatio();
});
$img->save($path);
С участием
$img = Image::make($path)->resize($width, $height)->save($path);
Надеюсь, вы понимаете, как создать миниатюру в Laravel с помощью библиотеки Intervention Image. Я хотел бы услышать ваши мысли в разделе комментариев ниже.
Статьи по Теме
- Изменить размер изображения в Laravel с помощью библиотеки изображений вмешательства
- Руководство по загрузке и сжатию изображений в Laravel
- Загрузить и изменить размер нескольких изображений в Laravel