imageMagick 을 활용한 이미지 확장자 및 사이즈 변환
imageMagick은 쉽게 말해 터미널용 포토샵이라고 할 수 있다. imageMagick을 사용하게 된 이유는 썸네일 이미지의 resize와 확장자 변환 작업 후 S3에 업로드 도중 gif 이미지 확장자 변환 시 문제가 생겨 이용하게 되었고, 해당 과정에서 imageMagick의 사용법을 정리한다.
imageMagick 을 활용한 이미지 확장자 및 사이즈 변환
imageMagick 사용 이전에 Thumbnailator 라는 오픈소스 라이브러리를 사용하고 있었는데 gif 이미지를 변환 시키니 gif 파일 특성인 움짤 기능이 사라지고 변환시킬때의 프레임 화면으로만 확장자 및 사이즈가 변경되어 있어 해결법을 찾다 보니 imageMagick을 알게 되어 활용하게 되어 있다.
먼저 imageMagick 설치 방법 (Mac)에 대해서 알아본다.
설치 방법
imageMagick 의 설치는 brew를 이용해 쉽게 설치가 가능하다.
brew install imageMagick
설치량이 많아서 조금 기다려야 한다.
설치가 완료되었다면 다음의 명령어를 통해 변환이 가능하다.
확장자만 변환하고 싶은 경우
- convert [변환 대상 이미지] [변환 하고자 하는 확장자의 이미지]
- convert in_image.jpg out_image.webp
사이즈까지 같이 변환하고 싶은 경우
- 이때는 resize 명령어를 같이 사용하면 된다.
- 크기 지정은 다음과 같이 가능하며
- convert in_image.jpg -resize 100x100 out_image.webp
- 비율로도 지정이 가능하다.
- convert in_image.jpg -resize 50% out_image.webp -> 크기 1/2
- convert in_image.jpg -resize 25% out_image.webp -> 크기 1/4
그럼 코드상에서 해당 명령어(- convert in_image.jpg -resize 50% out_image.webp -> 크기 1/2)를 통해 이미지 변환을 하고자 할때는 다음과 같이 사용하면 된다.
val runtime = Runtime.getRuntime()
runtime.exec(String.format("%s %s -resize 50%% %s","convert",{변환하고자 하는 파일경로}, {변환 후 파일경로 및 파일명과 확장자 설정})).waitFor()
다음과 같이 Runtime 클래스를 통해 파일 변환 명령어를 실행할 수 있으며 여기에서 waitFor() 메서드를 호출하면 프로세스가 종료될 때까지 블록이 생겨 파일 변환을 끝마칠때까지 대기 후 이후 코드를 실행해 나갈 수 있다.
해당 예시의 경우는 구글에서 만든 이미지 파일 포맷인 webP로 변환 후 S3 버킷에 업로드한 예시이다. webP 에 대해서 간단히 소개하면 웹사이트의 페이지를 보다 빠르게 읽을 수 있도록 개발된 이미지 확장자이다. 왜 그런지는 아래 변환된 파일의 용량을 보면 알 수 있다.
해당 이미지의 경우 png인 파일이었는데 webp로 변경하니 이미지 용량이 많이 줄어든 모습을 확인할 수 있다.
이렇게 imageMagick을 통해 파일을 변환하는 방법에 대해서 알아보았다.
참고
https://jh-make.tistory.com/entry/ImageMagick-%EA%B8%B0%EC%B4%88
https://imagemagick.org/index.php