본문 바로가기
+ Development/Python

[Python] 파이썬 PIL(Pillow) 라이브러리를 이용한 이미지 변환(1편)

by :: Teacher :: 2021. 7. 5.
728x90
반응형

PIL(Pillow)는 Python Image Library의 약자로 이미지에 대해서 많은 작업을 할 수 있게 도와주는 파이썬 라이브러리이다.

요즘 로딩 속도에 영향을 주는 이미지 파일 사이즈 관련해서 이런저런 내용을 읽다가 다른 Tool 번거롭게 사용하는 것보다는 해당 라이브러리를 이용해서 본인에게 좀 더 최적화된 상태로 사용할 수 있어 내용을 살펴보았다.

그리고 요즘 WebP라는 구글에서 만들어진 이미지 포맷으로 구글의 서비스에서는 썸 내일 등 WebP를 많이 사용하고 있어 관심도 가지게 되었다. 

그렇다면 PIL(Pillow) 라이브러리를 이용해서 어떻게 사용이 가능한지 알아보도록 하자.

1. 라이브러리 설치

우선 사용을 위해서는 Pillow 라이브러리를 설치해야 한다. 

pip 명령어를 통해서 아래와 같이 설치를 해보도록 하자. 

  • $ pip install pillow
# pip를 이용한 Pillow 설치

$ pip install pillow
Collecting pillow
  Downloading Pillow-8.3.0-cp38-cp38-macosx_10_10_x86_64.whl (2.9 MB)
     |████████████████████████████████| 2.9 MB 1.7 MB/s 
Installing collected packages: pillow
Successfully installed pillow-8.3.0

1. 라이브러리 설치

728x90

2. 지원하는 이미지 포맷

PIL(Pillow)는 다양한 이미지 파일 형식을 지원하며, 30 개 이상의 서로 다른 파일 형식을 식별하고 읽을 수 있다.

그중 아래와 같이 4개지의 분류로 지원 방식을 나눌 수 있으며, 완벽 지원(Fully Supported)에 포함되지 않은 이미지 포맷은 추후 라이브러리 발전에 따라서 지원되지 않을까 생각된다. 이미 완변 지원 포맷에 있는 이미지 포맷이 거의 대부분 사용되는 부분이라 라이브러리를 이용하여 사용하는데 불편함은 없을 것이다. 자세한 내용은 해당 라이브러리 Document에 자세히 나와 있다.

 

Image file formats

The Python Imaging Library supports a wide variety of raster file formats. Over 30 different file formats can be identified and read by the library. Write support is less extensive, but most common...

pillow.readthedocs.io

2.1 완벽 지원 포맷(Fully Supported)

  • BMP
  • DDS
  • DIB
  • EPS
  • GIF
  • Reading sequences
  • Saving
  • Reading local images
  • ICNS
  • ICO
  •  IM
  • JPEG
  • JPEG 2000
  • MSP
  • PCX
  • PNG
  • APNG sequences
  • Saving
  • PPM
  • SGI
  • SPIDER
  • Writing files in SPIDER format
  • TGA
  • TIFF
  • Reading Multi-frame TIFF Images
  • Saving Tiff Images
  • WebP
  • Saving sequences
  • XBM

2.2 읽기만 가능한 포맷(Read-Only)

  • BLP
  • CUR
  • DCX
  • FLI, FLC
  • FPX
  • FTEX
  • GBR
  • GD
  • IMT
  • IPTC/NAA
  • MCIDAS
  • MIC
  • MPO
  • PCD
  • PIXAR
  • PSD
  • WAL
  • WMF
  • XPM

2.3 쓰기만 가능한 포맷(Write-Only)

  • PALM
  • PDF
  • XV Thumbnails

2.4 식별만 가능한 포맷(Identify-Only)

  • BUFR
  • FITS
  • GRIB
  • HDF5
  • MPEG

3. PIL(Pillow) 라이브러리 사용 방법

그럼 이제 PIL(Pillow) 라이브러리를 이용하여 어떤 것들을 할 수 있는지 알아보도록 하자. 

3.1 테스트 이미지 파일 

일단 사용에 필요한 테스트 이미지 파일이 필요하다. 

테스트 이미지는 해당 라이브러리 Git에 Example 예제로 사용되는 파일을 사용하도록 하겠다. 

anchors.png
0.01MB

혹시 몰라 파일도 첨부해놓았다. 

3.2 이미지 파일 기본 정보 읽기

이미지 파일의 기본 정보로는 이미지 포맷 / 이미지 사이즈 / 이미지 모드를 확인할 수 있다.

이중 사이즈는 가로, 세로로 표현되며 Pixel(픽셀)로 표현된다.

참고로 파일을 읽지 못한다면, OSError로 예외 발생되니 Exception 처리 시 OSError로 진행하면 된다.

# -*- coding: utf-8 -*-
from PIL import Image

# 1. 이미지 파일 기본 정보 읽기 #
try:
    im = Image.open("anchors.png")
    img_width, img_height = im.size
    print("이미지 확장자:", im.format)
    print("이미지 사이즈:", im.size)
    print("이미지 가로:", img_width)
    print("이미지 세로:", img_height)
    print("이미지 모드:", im.mode)
except OSError as e:
    print(e)


[output]
이미지 확장자: PNG
이미지 사이즈: (600, 300)
이미지 가로: 600
이미지 세로: 300
이미지 모드: RGBA

 

3.3 이미지 파일 변환

현재 사용되는 이미지 파일을 타 이미지 파일 포맷으로 변환이 가능하다.

그럼 한번 변환해보도록 하자.

# -*- coding: utf-8 -*-
from PIL import Image

# 2. 이미지 파일 변환(에러) #
try:
    im = Image.open("anchors.png")
    im.save("anchors.jpg", 'jpeg')
except OSError as e:
    print(e)


[output]
cannot write mode RGBA as JPEG

 

위처럼 내용처럼 "cannot write mode ~ "라는 Error 메시지가 발생된다.

RGB, RGBA 등 모드에 따라서 원하는 파일 포맷으로 변환이 되지 않을 수 있다. 

그럼에 따라 이미지 모드를 확인 후 진행하는 게 좋으나, 그런 경우 불편함이 있을 수 있기에 처음부터 이미지 모드를 변경 후 원하는 파일 포맷으로 변환을 한다면 문제없이 변환이 가능하다.

  • convert('RGB') 함수 사용을 통해 이미지 모드를 통일하여 사용하자.
# -*- coding: utf-8 -*-
from PIL import Image

# 2. 이미지 파일 변환(정상) #
try:
    im = Image.open("anchors.png").convert('RGB')
    im.save("anchors.webp", 'webp')

    change_im = Image.open("anchors.webp")
    img_width, img_height = change_im.size
    print("이미지 확장자:", change_im.format)
    print("이미지 사이즈:", change_im.size)
    print("이미지 가로:", img_width)
    print("이미지 세로:", img_height)
    print("이미지 모드:", change_im.mode)
except OSError as e:
    print(e)


[output]
이미지 확장자: WEBP
이미지 사이즈: (600, 300)
이미지 가로: 600
이미지 세로: 300
이미지 모드: RGB

 

4. 예제 Code

이번에는 매우 간단한 방법으로 이미지 변환하는 방법에 대해서 알아보았다. 

간단하게 위에 나온 예제 파일은 itschool-info-lab Github에 올려놓았다.

이제 간단한 내용을 해 보았으나, 이제 다음편에는 여러 방법들을 알아보도록 하자.

 

itschool-info-lab/python-example-code

:: IT School :: Python Example Code. Contribute to itschool-info-lab/python-example-code development by creating an account on GitHub.

github.com

5. 참고 문서

 

python-pillow/Pillow

The friendly PIL fork (Python Imaging Library). Contribute to python-pillow/Pillow development by creating an account on GitHub.

github.com

 

WebP - 위키백과, 우리 모두의 백과사전

WebP 위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

728x90
반응형

댓글


loading