이미지 조작 클래스

CodeIgniter의 이미지 조작 클래스를 사용하면 다음 작업을 수행할 수 있습니다:

  • 이미지 리사이즈

  • 썸네일 생성

  • 이미지 크롭

  • 이미지 회전

  • 이미지 워터마크

지원되는 이미지 라이브러리는 GD/GD2와 ImageMagick입니다.

클래스 초기화

CodeIgniter의 다른 클래스와 마찬가지로, 이미지 클래스는 전역 함수 service()를 호출하여 컨트롤러에서 초기화합니다:

<?php

$image = service('image');

사용하려는 이미지 라이브러리의 별칭을 전역 함수 service()에 전달할 수 있습니다:

<?php

$image = service('image', 'imagick');

사용 가능한 핸들러는 다음과 같습니다:

  • gd GD/GD2 이미지 라이브러리

  • imagick ImageMagick 라이브러리.

참고

ImageMagick 핸들러는 imagick 확장이 필요합니다.

참고

Windows에서 ImageMagick 핸들러는 이미지를 로드할 때 절대 파일 경로가 필요합니다 (예: WRITEPATH 또는 FCPATH 사용).

이미지 처리

리사이즈, 크롭, 회전, 워터마크 등 수행하려는 처리 유형에 관계없이 일반적인 과정은 동일합니다. 수행하려는 작업에 해당하는 설정을 지정한 다음, 사용 가능한 처리 함수 중 하나를 호출합니다.

예를 들어, 이미지 썸네일을 생성하려면 다음과 같이 합니다:

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 100, 'center')
    ->save('/path/to/image/mypic_thumb.jpg');

위 코드는 라이브러리에 /path/to/image 폴더에 있는 mypic.jpg라는 이미지를 찾고, 100 x 100 픽셀의 새 이미지를 생성하여 mypic_thumb.jpg라는 새 파일로 저장하도록 지시합니다. fit() 메서드를 사용하므로 원하는 종횡비를 기반으로 크롭할 최적의 이미지 부분을 찾아 결과를 크롭하고 리사이즈합니다.

이미지는 저장하기 전에 필요한 만큼 여러 메서드를 통해 처리될 수 있습니다. 원본 이미지는 그대로 유지되고, 새 이미지가 각 메서드를 통해 전달되어 이전 결과 위에 결과가 적용됩니다:

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->reorient()
    ->rotate(90)
    ->crop(100, 100, 0, 0)
    ->save('/path/to/image/mypic_thumb.jpg');

이 예시는 동일한 이미지를 가져와 먼저 모바일 폰의 방향 문제를 수정하고, 이미지를 90도 회전한 다음, 왼쪽 상단 모서리에서 시작하여 결과를 100 x 100 픽셀 이미지로 크롭합니다. 결과는 썸네일로 저장됩니다.

참고

이미지 클래스가 처리를 수행할 수 있으려면 이미지 파일이 있는 폴더에 쓰기 권한이 있어야 합니다.

참고

이미지 처리는 일부 작업에서 상당한 양의 서버 메모리를 필요로 할 수 있습니다. 이미지 처리 중 메모리 부족 오류가 발생하면 최대 크기를 제한하거나 PHP 메모리 한도를 조정해야 할 수 있습니다.

이미지 품질

save()는 결과 이미지 품질을 변경하는 추가 파라미터 $quality를 받을 수 있습니다. 값 범위는 0에서 100이며 프레임워크 기본값은 90입니다. 이 파라미터는 JPEG 및 WebP 이미지에만 적용되며 그 외에는 무시됩니다:

참고

WebP에 대한 $quality 파라미터는 v4.4.0부터 사용 가능합니다.

<?php

$image->withFile('/path/to/image/mypic.jpg')
    // processing methods
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);

참고

품질이 높을수록 파일 크기가 커집니다. https://www.php.net/manual/en/function.imagejpeg.php 도 참조하십시오.

처리 없이 이미지 품질만 변경하려는 경우, 이미지 리소스를 포함해야 합니다. 그렇지 않으면 완전히 동일한 복사본이 만들어집니다:

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->withResource()
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);

처리 메서드

사용 가능한 처리 메서드는 일곱 가지입니다:

  • $image->crop()

  • $image->convert()

  • $image->fit()

  • $image->flatten()

  • $image->flip()

  • $image->resize()

  • $image->rotate()

  • $image->text()

이 메서드들은 클래스 인스턴스를 반환하므로 위에서 보여준 것처럼 체이닝할 수 있습니다. 실패하면 오류 메시지를 담은 CodeIgniter\Images\ImageException을 발생시킵니다. 다음과 같이 예외를 잡아 실패 시 오류를 표시하는 것이 좋은 방법입니다:

<?php

$image = service('image');

try {
    $image->withFile('/path/to/image/mypic.jpg')
        ->fit(100, 100, 'center')
        ->save('/path/to/image/mypic_thumb.jpg');
} catch (\CodeIgniter\Images\Exceptions\ImageException $e) {
    echo $e->getMessage();
}

이미지 크롭

이미지를 크롭하여 원본 이미지의 일부만 남길 수 있습니다. 특정 크기/종횡비에 맞는 썸네일 이미지를 만들 때 자주 사용됩니다. crop() 메서드로 처리합니다:

crop(int $width = null, int $height = null, int $x = null, int $y = null, bool $maintainRatio = false, string $masterDim = 'auto')
  • $width는 결과 이미지의 원하는 너비(픽셀)입니다.

  • $height는 결과 이미지의 원하는 높이(픽셀)입니다.

  • $x는 크롭을 시작할 이미지 왼쪽에서의 픽셀 수입니다.

  • $y는 크롭을 시작할 이미지 상단에서의 픽셀 수입니다.

  • $maintainRatio가 true이면 이미지의 원래 종횡비를 유지하기 위해 최종 크기를 필요에 따라 조정합니다.

  • $masterDim$maintainRatio가 true일 때 변경하지 않을 치수를 지정합니다. 값은 'width', 'height', 또는 'auto'가 될 수 있습니다.

이미지 중앙에서 50 x 50 픽셀 정사각형을 자르려면 먼저 적절한 x 및 y 오프셋 값을 계산해야 합니다:

<?php

$info = service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->getFile()
    ->getProperties(true);

$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->crop(50, 50, $xOffset, $yOffset)
    ->save('/path/to/new/image.jpg');

이미지 변환

convert() 메서드는 원하는 파일 형식에 대한 라이브러리의 내부 표시자를 변경합니다. 실제 이미지 리소스를 변경하지 않고 save()에 사용할 형식을 알려줍니다:

convert(int $imageType)

참고

ImageMagick은 $imageType을 무시하고 파일 확장자가 나타내는 타입으로 파일을 저장합니다.

이미지 맞추기

fit() 메서드는 다음 단계를 수행하여 이미지의 일부를 “스마트”하게 크롭하는 것을 간소화합니다:

  • 원하는 종횡비를 유지하기 위해 원본 이미지에서 크롭할 올바른 부분을 결정합니다.

  • 원본 이미지를 크롭합니다.

  • 최종 크기로 리사이즈합니다.

fit(int $width, int $height = null, string $position = 'center')
  • $width는 이미지의 원하는 최종 너비입니다.

  • $height는 이미지의 원하는 최종 높이입니다.

  • $position은 크롭할 이미지의 부분을 결정합니다. 허용되는 위치: 'top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right'.

이는 항상 종횡비를 유지하면서 훨씬 간단하게 크롭하는 방법을 제공합니다:

<?php

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 150, 'left')
    ->save('/path/to/new/image.jpg');

이미지 평탄화

flatten() 메서드는 투명한 이미지(PNG) 뒤에 배경색을 추가하고 RGBA 픽셀을 RGB 픽셀로 변환하는 것을 목적으로 합니다.

  • 투명 이미지를 jpg로 변환할 때 배경색을 지정합니다.

flatten(int $red = 255, int $green = 255, int $blue = 255)
  • $red는 배경의 빨간색 값입니다.

  • $green은 배경의 초록색 값입니다.

  • $blue는 배경의 파란색 값입니다.

<?php

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten()
    ->save('/path/to/new/image.jpg');

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten(25, 25, 112)
    ->save('/path/to/new/image.jpg');

이미지 뒤집기

이미지는 수평 또는 수직 축을 기준으로 뒤집을 수 있습니다:

flip(string $dir)
  • $dir은 뒤집을 축을 지정합니다. 'vertical' 또는 'horizontal'이 될 수 있습니다.

<?php

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->flip('horizontal')
    ->save('/path/to/new/image.jpg');

이미지 리사이즈

resize() 메서드를 사용하여 이미지를 원하는 크기로 리사이즈할 수 있습니다:

resize(int $width, int $height, bool $maintainRatio = false, string $masterDim = 'auto')
  • $width는 새 이미지의 원하는 너비(픽셀)입니다.

  • $height는 새 이미지의 원하는 높이(픽셀)입니다.

  • $maintainRatio는 이미지를 새 크기에 맞게 늘릴지, 원래 종횡비를 유지할지 결정합니다.

  • $masterDim은 종횡비를 유지할 때 어느 축의 치수를 기준으로 할지 지정합니다. 'width' 또는 'height'입니다.

이미지 리사이즈 시 원본 이미지의 비율을 유지할지, 원하는 크기에 맞게 늘리거나 압축할지 선택할 수 있습니다. $maintainRatio가 true이면 $masterDim으로 지정한 치수는 그대로 유지되고, 나머지 치수는 원본 이미지의 종횡비에 맞게 변경됩니다.

<?php

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->resize(200, 100, true, 'height')
    ->save('/path/to/new/image.jpg');

이미지 회전

rotate() 메서드를 사용하면 이미지를 90도 단위로 회전할 수 있습니다:

rotate(float $angle)
  • $angle은 회전할 각도(도)입니다. 90, 180, 270 중 하나입니다.

참고

$angle 파라미터는 부동소수점을 허용하지만 처리 중 정수로 변환됩니다. 위에 나열된 세 가지 값 이외의 값이면 CodeIgniter\Images\ImageException을 발생시킵니다.

텍스트 워터마크 추가

text() 메서드를 사용하면 이미지에 텍스트 워터마크를 매우 간단하게 오버레이할 수 있습니다. 저작권 고지, 사진작가 이름을 표시하거나 다른 사람의 최종 제품에 사용되지 않도록 이미지를 미리보기로 표시할 때 유용합니다.

text(string $text, array $options = [])

첫 번째 파라미터는 표시할 텍스트 문자열입니다. 두 번째 파라미터는 텍스트 표시 방법을 지정할 수 있는 옵션 배열입니다:

<?php

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->text('Copyright 2017 My Photo Co', [
        'color'      => '#fff',
        'opacity'    => 0.5,
        'withShadow' => true,
        'hAlign'     => 'center',
        'vAlign'     => 'bottom',
        'fontSize'   => 20,
    ])
    ->save('/path/to/new/image.jpg');

인식되는 가능한 옵션은 다음과 같습니다:

  • color 텍스트 색상(16진수), 예: '#ff0000'

  • opacity 텍스트의 불투명도를 나타내는 01 사이의 숫자.

  • withShadow 그림자를 표시할지 여부를 나타내는 불리언 값.

  • shadowColor 그림자 색상(16진수)

  • shadowOffset 그림자를 오프셋할 픽셀 수. 수직 및 수평 값 모두에 적용됩니다.

  • hAlign 수평 정렬: 'left', 'center', 'right'

  • vAlign 수직 정렬: 'top', 'middle', 'bottom'

  • hOffset x축의 추가 오프셋(픽셀)

  • vOffset y축의 추가 오프셋(픽셀)

  • fontPath 사용할 TTF 폰트의 전체 서버 경로. 지정하지 않으면 시스템 폰트가 사용됩니다.

  • fontSize 사용할 폰트 크기. GD 핸들러에서 시스템 폰트를 사용할 때 유효한 값은 1에서 5까지입니다.

이미지 메타데이터 제거

이 메서드는 이미지에서 메타데이터(EXIF, XMP, ICC, IPTC, 주석 등)를 제거합니다.

중요

GD 이미지 라이브러리는 처리 중 모든 메타데이터를 자동으로 제거하므로, GD 핸들러를 사용할 때 이 메서드는 추가적인 효과가 없습니다. 이 동작은 GD 자체에 내장되어 있으며 수정할 수 없습니다.

일부 필수 기술 메타데이터(크기, 색 깊이)는 이미지 표시에 필요하므로 저장 시 재생성됩니다. 그러나 GPS 위치, 카메라 정보, 타임스탬프 등 개인 정보와 관련된 모든 정보는 완전히 제거됩니다.

<?php

service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->clearMetadata()
    ->save('/path/to/new/image.jpg');