Ruby 애플리케이션에서 이미지를 다루다 보면, 이미지를 다양한 방식으로 수정해야 할 필요가 자주 생기곤 합니다.
예를 들어 저장 공간을 절약하고 사용자에게 더 빠른 다운로드 속도를 제공하기 위해 이미지 크기를 줄이는 작업이 대표적이죠.
그렇다면 이 작업은 어떻게 수행할 수 있을까요?
바로 MiniMagick이라는 젬(gem)이 도와줄 수 있습니다.
MiniMagick은 ImageMagick 프로그램과 여러분의 Ruby 코드 사이를 이어주는 인터페이스 역할을 합니다.
이를 통해 다양한 이미지 변환 기능을 손쉽게 적용하여 원하는 형태로 이미지를 커스터마이징할 수 있습니다!
먼저:
운영체제의 패키지 관리자를 이용하거나 프로젝트 공식 웹사이트에서 설치 파일을 내려받아 ImageMagick을 설치해야 합니다.
설치가 끝나면 mini_magick을 통해 일반적인 Ruby 메서드만으로 이미지를 자유롭게 변경할 수 있습니다.
몇 가지 실전 예시를 살펴보겠습니다!
이미지 열기
이미지를 여는 방법은 두 가지입니다:
MiniMagick::Image.open=> 원본의 복사본을 생성MiniMagick::Image.new=> 원본 이미지를 직접 수정
open 메서드는 파일 경로뿐 아니라 URL도 인자로 받을 수 있어, 웹상의 이미지를 곧바로 가져올 수 있습니다.
여기서는 무료 사진 공유 사이트인 Unsplash의 이미지를 사용해 보겠습니다.

이미지를 로드하는 방법은 다음과 같습니다:
require 'mini_magick' image = MiniMagick::Image.open( "https://images.unsplash.com/photo-1516295615676-7ae4303c1c63" )
이미지를 불러오면 크기, 해상도, 포맷 등의 정보를 확인할 수 있습니다.
확인 방법은 다음과 같습니다:
image.dimensions # [3963, 5944] image.type # "JPEG" image.human_size # "20.7663MB"
상당히 용량이 큰 이미지네요. 크기를 줄여 보겠습니다!
아울러 세로 이미지를 가로 이미지로 만들기 위해 회전시키고 싶습니다.
크기 조절 및 회전
이미지 크기는 다음과 같이 조절할 수 있습니다:
image.resize "500x500"
위 코드는 정확한 픽셀 크기로 맞추는 방식입니다. 만약 화면비(aspect ratio)를 유지하면서 백분율 기준으로 크기를 조정하고 싶다면...
다음과 같이 하면 됩니다:
image.resize "25%"
이 코드는 25%만큼 축소하는 것이 아니라, 원본 크기의 25% 크기로 조정한다는 의미입니다.
이제:
변경 사항을 적용하려면 파일을 디스크에 다시 저장해야 합니다.
저장 방법은 다음과 같습니다:
image.write("/tmp/new_image.jpg")
단, open 대신 new로 원본을 직접 수정하는 방식으로 열었다면 write를 호출할 필요가 없습니다.
이미지 자르기(Crop) 방법
이미지의 일부를 잘라내면 원치 않는 부분을 제거하고 파일 크기도 줄일 수 있습니다.
문법은 다음과 같습니다:
<width> x <height> +<xoffset> +<yoffset>
예를 들어 이미지의 아래쪽 절반을 잘라내고 싶다면:
image.crop "100%x50%+0+0"
좌우 절반만 남기려면:
image.crop "50%x100%+0+0"
원하는 결과물이 나올 때까지 숫자 값을 조금씩 조정해 보세요.
둥근 이미지 만들기
이미지를 둥근 형태로 만들고 싶다면 여러 메서드를 조합해야 합니다.
구현 방법은 다음과 같습니다:
MiniMagick::Tool::Convert.new do |img| img.size '3900x5000' img << 'xc:transparent' img.fill "apple.jpg" img.draw "translate 2000, 2500 circle 0,0 2000,0" img.trim img << 'circle.png' end
이 코드는 지정된 크기의 빈 캔버스를 생성합니다. 이 크기는 둥글게 만들려는 원본 이미지와 동일해야 합니다.
그다음:
캔버스에 이미지를 채우고 중앙에 원을 그린 뒤, 원 바깥 영역을 제거합니다.
마지막으로 결과물이 "circle.png"로 저장됩니다.
참고로 translate 2000, 2500은 캔버스 중앙의 좌표이며,
circle 0,0 2000,0에서 두 번째 2000은 원의 반지름입니다.
MiniMagick으로 테두리 추가하기
mini_magick으로 테두리를 추가하는 것은 매우 간단합니다.
예시:
img.border 10
테두리 색상은 다음과 같이 지정합니다:
img.bordercolor("white")
new가 아닌 open을 사용했다면, 변경 사항을 write로 저장하는 것을 잊지 마세요.
이미지 최적화
이미지 최적화는 단순히 파일 크기를 줄이는 것 이상의 작업을 포함합니다.
예를 들어 mini_magick의 strip 메서드를 사용하면 이미지에 포함된 메타데이터를 제거할 수 있습니다.
사용 방법:
image.strip
더 강력한 최적화가 필요하다면 image_optim 같은 젬을 활용할 수도 있습니다.
예시:
require 'image_optim'
image_optim.optimize_image!('orange.jpg')
마무리 요약
이번 글에서는 mini_magick Ruby 젬을 사용해 이미지를 회전, 리사이즈, 자르기 등 다양하게 변환하는 방법을 배웠습니다!
읽어주셔서 감사합니다.