업로드된 이미지 파일을 Laravel에서 자유롭게 편집하고 저장하기 위해서는 어떻게 해야할까?? 이번에 담당하게 된 프로젝트에서 저 질문에 대한 답을 찾지 않으면 안될 상황이 생겼기에..어서 빨리 답을 찾아보자..
우선 해당 기능을 구현하기 위한 이미지 편집에 특화된 PHP 라이브러리를 찾아 보았다. 프로젝트의 이미지 편집 기능을 구현하기 위해서는 아래의 조건에 만족해야 했기에, 이 부분을 고려해서 라이브러리를 선정하였다.
생각보다 많은 이미지 편집 라이브러리가 있었으나 조건 2를 만족하는 라이브러리는 Intervention Image뿐이었기에, 이걸로 선정하였다.
"PHP에서 이미지 편집을 쉽게 해주는 라이브러리" 라는 심플한 소개와는 다르게 과장해서 왠만한 이미지 편집기 수준의 다양한 기능을 제공하였다.
공식 문서 : https://image.intervention.io/v3
composer require intervention/image-laravel
다른 라이브러리와 동일하게 아래의 명령어를 통해 설정 파일을 커스텀 할 수 있다.
실행 시, config/image.php라는 파일이 생성되며 해당 설정을 바꿔서 사용하면 된다.
php artisan vendor:publish --provider="Intervention\Image\Laravel\ServiceProvider"
// testController.php
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Laravel\Facades\Image;
// 저장한 위치에 있는 이미지 파일을 바이너리 데이터로 변환 후, 변경 가능하도록 이미지 객체로 변환
$image = Image::read(Storage::get('images/cats.jpg'));
※ 이미지 파일의 경로는 config/filesystems.php의 설정을 기준으로 한다.
// config/filesystems.php
// 파일 기본 경로는 "storage/app/pulbic/"이 된다.
'default' => env('FILESYSTEM_DISK', 'local'),
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app/pulbic'),
],
]
간단하게 귀여운 고양이 사진의 사이즈를 240x200으로 조정하고 저장해보도록 하자.
$image = Image::read(Storage::get('images/cat.jpg'));
// 사이즈를 240X200으로 변경
$resizedImage = $image->scale(width: 240, height: 200);
// 이미지 파일 저장
$resizedImage->save(Storage::path('images/update_cat.jpg'));

프로젝트의 사양에 맞는 이미지 편집을 진행해 보자.
// 워터마크용 이미지 추가
$watermarkImage = Image::read(Storage::get('images/base.png'));
// 워터마크용 이미지에 텍스트 삽입
$watermarkImage->text('Cat Number : 123456', 30, 50, function (FontFactory $font) {
$font->filename('./fonts/arial.ttf');
$font->size(40);
$font->color('fff');
});
$watermarkImage->text('Birthday : 2025-02-09', 30, 110, function (FontFactory $font) {
$font->filename('./fonts/arial.ttf');
$font->size(40);
$font->color('fff');
});
// 생성한 워터마크 이미지 저장
$watermarkImage->save(Storage::path('images/update_base.png'));
// 메인 이미지 추가
$image = Image::read(Storage::get('images/cat.jpg'));
// 메인 이미지에 워터마크용 이미지 세팅 및 저장
$watermark = Storage::get('images/update_base.png');
$image->scale(width: 575, height: 980)
->place(
element: $watermark,
position: 'bottom',
)
->save(Storage::path('images/update_cat.jpg'));
