Laravel에서 이미지 다루기

이하루·2025년 2월 7일

업로드된 이미지 파일을 Laravel에서 자유롭게 편집하고 저장하기 위해서는 어떻게 해야할까?? 이번에 담당하게 된 프로젝트에서 저 질문에 대한 답을 찾지 않으면 안될 상황이 생겼기에..어서 빨리 답을 찾아보자..

🌱 라이브러리 찾기

우선 해당 기능을 구현하기 위한 이미지 편집에 특화된 PHP 라이브러리를 찾아 보았다. 프로젝트의 이미지 편집 기능을 구현하기 위해서는 아래의 조건에 만족해야 했기에, 이 부분을 고려해서 라이브러리를 선정하였다.

  1. 이미지 사이즈 조정이 가능
  2. 디테일한 워터마크 편집 및 자유로운 위치 조정이 가능

생각보다 많은 이미지 편집 라이브러리가 있었으나 조건 2를 만족하는 라이브러리는 Intervention Image뿐이었기에, 이걸로 선정하였다.

🔎 Intervention Image

"PHP에서 이미지 편집을 쉽게 해주는 라이브러리" 라는 심플한 소개와는 다르게 과장해서 왠만한 이미지 편집기 수준의 다양한 기능을 제공하였다.

공식 문서 : https://image.intervention.io/v3

👻 사용해 보자!!

1. Intervention Image를 프로젝트에 추가

composer require intervention/image-laravel

다른 라이브러리와 동일하게 아래의 명령어를 통해 설정 파일을 커스텀 할 수 있다.
실행 시, config/image.php라는 파일이 생성되며 해당 설정을 바꿔서 사용하면 된다.
php artisan vendor:publish --provider="Intervention\Image\Laravel\ServiceProvider"

2. 이미지 객체 추출

// 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'),
	],
]

3. 이미지 수정 및 저장 테스트

간단하게 귀여운 고양이 사진의 사이즈를 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'));

4. 실전 이미지 수정 및 저장

프로젝트의 사양에 맞는 이미지 편집을 진행해 보자.

// 워터마크용 이미지 추가
$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'));

profile
어제보다 더 나은 하루

0개의 댓글