이미지 파일의 용량이 너무 커서 줄이고 싶을 때가 있습니다.
인터넷 상의 많은 데이터는 이미지가 차지하고 있습니다. 또한, 최근 스마트폰의 놀라운 화질 역시, 해당 고화질을 표현하기 위해서 데이터 용량을 아낌없이 사용하고 있습니다. 그러나 우리가 가지고 있는 저장소의 용량은 한정되어있기 때문에, 경우에 따라 이것을 효율적으로 사용할 방법이 필요합니다.
저의 경우에는, 구글 포토 등의 대용량 사진 데이터를 NAS로 백업하기 위해 이와 같은 방법을 사용하기로 합니다.
Python과 파이썬의 이미지 처리 라이브러리인 Pillow를 사용합니다.
pip install pillow
def compress_image(file_path: str, new_file_path: str, max_resolution: int = 1920, quality: int = 90) -> bool:
"""
file_path: 기존 파일의 경로
new_file_path: 저장될 파일의 경로
max_resolution: 저장될 파일의 최대 해상도
quality: 저장될 파일의 화질
"""
with Image.open(file_path) as img:
# 예외 처리: 이미지 파일이 아닌 경우에는 False 를 반환합니다.
if img.format != 'JPEG' and img.format != 'PNG':
return False
# 예외 처리: 파일이 존재하지 않을 경우에는 False를 반환합니다.
if img is None:
return False
# 이미지의 용량은 이미지의 해상도에 큰 영향을 받습니다.
# 해상도가 높을 경우, 해상도를 낮추는 처리를 합니다.
if img.height > max_resolution or img.width > max_resolution:
# pillow 에는 resize 메소드도 있지만, thumbnail 메소드를 이용하면
# 이미지의 비율을 유지한 상태로 크기를 낮춰 줍니다.
# 아래의 경우에는 가로나 세로의 길이가 1920보다 클 경우 그에 맞춰서
# 크기를 낮춰 줍니다. (올리진 않습니다.)
# argument로 해상도를 받는데, Tuple을 받고 있는 것에 유의.
# (괄호가 2개(()) )
img.thumbnail((max_resolution, max_resolution))
# image의 save 메소드는 새 파일 경로을 받고,
# quality 등의 추가 파라미터를 명시할 수 있습니다.
# 아래에서는 webp라고 하는 포맷을 이용해 고화질로 저장하도록 합니다.
# WebP는 구글에서 개발한 이미지 포맷으로, 낮은 용량으로 고화질 이미지를 저장할 수 있지만
# 브라우저 호환과 소프트웨어 호환성이 떨어집니다.
# 최신 버전 기준으로는 Internet Exploer 이외의 브라우저는 모두 지원하고 있습니다.
# source : https://caniuse.com/webp
# 호환성이 더 중요한 환경이라면, 'jpeg'를 사용하세요.
img.save(new_file_path, 'webp', quality=quality)
return True
Pillow 개발문서: https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.thumbnail
위의 함수를 이용해서, 원하는 이미지 파일을 해상도와 화질, 포맷으로 전환할 수 있습니다.
이것을 사용한 간단한 예시 프로젝트를 첨부합니다.
https://github.com/pjc1991/py-image-storage
(./image_handler.py)