이미지 조작 클래스
CodeIgniter의 이미지 조작 클래스를 사용하면 다음 작업을 수행할 수 있습니다:
이미지 리사이즈
썸네일 생성
이미지 크롭
이미지 회전
이미지 워터마크
지원되는 이미지 라이브러리는 GD/GD2와 ImageMagick입니다.
클래스 초기화
CodeIgniter의 다른 클래스와 마찬가지로, 이미지 클래스는 전역 함수 service()를 호출하여 컨트롤러에서 초기화합니다:
<?php
$image = service('image');
사용하려는 이미지 라이브러리의 별칭을 전역 함수 service()에 전달할 수 있습니다:
<?php
$image = service('image', 'imagick');
사용 가능한 핸들러는 다음과 같습니다:
gdGD/GD2 이미지 라이브러리imagickImageMagick 라이브러리.
참고
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)
$imageType은 PHP의 이미지 타입 상수 중 하나입니다 (예: https://www.php.net/manual/en/function.image-type-to-mime-type.php 참조):<?php service('image') ->withFile('/path/to/image/mypic.jpg') ->convert(IMAGETYPE_PNG) ->save('/path/to/new/image.png');
참고
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텍스트의 불투명도를 나타내는0과1사이의 숫자.withShadow그림자를 표시할지 여부를 나타내는 불리언 값.shadowColor그림자 색상(16진수)shadowOffset그림자를 오프셋할 픽셀 수. 수직 및 수평 값 모두에 적용됩니다.hAlign수평 정렬:'left','center','right'vAlign수직 정렬:'top','middle','bottom'hOffsetx축의 추가 오프셋(픽셀)vOffsety축의 추가 오프셋(픽셀)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');