728x90
반응형
Pillow(PIL)의 Image 객체는 Pillow 라이브러리에서 이미지 처리의 핵심이 되는 클래스임.

이는 이미지를 추상화 하며, 다음과 같은 주요 속성들을 가지고 있음:
기본 정보 속성
size
- 이미지의 크기를 (width, height) 튜플로 반환.
print(image.size) # (800, 600)
width, height
- 이미지의 너비와 높이를 각각 int 로 반환.
print(image.width) # 800 print(image.height) # 600
mode
- 이미지의 색상 모드를 문자열로 반환.
- 주요 모드로는 'RGB', 'RGBA', 'L'(그레이스케일), 'P'(팔레트), '1'(1비트) 등이 있음.
print(image.mode) # 'RGB'
color mode는 color model 또는 color space와 비슷한 것으로 생각해도 큰 문제 없음.
format
- 이미지 파일의 원본 파일 포맷을 반환
- JPEG, PNG, GIF 등의 문자열
- 참고로, 메모리에서 생성된 이미지의 경우
None.
print(image.format) # 'JPEG'
메타데이터 속성
info
- 이미지의 메타데이터를 dict 객체로 저장하고 있는 attribute.
- EXIF 데이터, DPI 정보 등이 포함될 수 있음.
print(image.info) # {'dpi': (72, 72), 'exif': b'...'}
EXIF는 "Exchangeable Image File Format"의 줄임말임.
디지털 카메라나 스마트폰에서 촬영한 사진 파일에
촬영 날짜, 카메라 설정(셔터 속도, 조리개, ISO 등),
GPS 위치 정보 등의 메타데이터를 저장하는 표준 포맷을 가리킴.
filename
- 이미지가 파일에서 로드된 경우 파일명.
- 문자열임.
print(image.filename) # '/path/to/image.jpg'
색상 관련 속성
palette
- 팔레트 모드('P') 이미지의 경우 색상 팔레트 정보를 반환.
# 이미지를 팔레트 모드로 변환
palette_image = image.convert('P')
print(f"팔레트 모드: {palette_image.mode}")
if palette_image.palette:
# 팔레트 정보 가져오기
palette_data = palette_image.palette.getdata()
print(f"팔레트 모드: {palette_data[0]}") # 'RGB' 또는 'RGBA'
# 팔레트 색상 데이터 (처음 10개 색상만)
palette_colors = palette_image.palette.getdata()[1][:30] # RGB이므로 3개씩
print("팔레트의 처음 10개 색상:")
for i in range(0, 30, 3):
r, g, b = palette_colors[i:i+3]
print(f"색상 {i//3 + 1}: RGB({r}, {g}, {b})")
참고: 팔레트 모드('P')란?
- 이미지에서 사용되는 색상을 최대 256개의 색상표(팔레트)로 제한하여
- 각 픽셀이 색상값 대신 팔레트의 인덱스 번호를 저장하는 방식.
- 이 방법은 메모리 사용량과 파일 크기를 크게 줄일 수 있어서 GIF 이미지나 웹용 이미지에서 주로 사용됨.
- 예를 들어 RGB 모드에서는 각 픽셀이 3바이트(24비트)를 사용하지만, 팔레트 모드에서는 1바이트(8비트)만 사용하여 색상을 표현함.
getcolors()
- 이미지에서 사용된 색상과 각 색상의 픽셀 수를 반환.
# RGB 이미지의 색상 분석 (최대 256개 색상까지)
colors = image.getcolors(maxcolors=256)
if colors:
print(f"발견된 색상 수: {len(colors)}")
# 가장 많이 사용된 색상 상위 5개
colors_sorted = sorted(colors, key=lambda x: x[0], reverse=True)
for i, (count, color) in enumerate(colors_sorted[:5]):
print(f"색상 {i+1}: RGB{color} - {count}개 픽셀")
else:
print("색상이 너무 많습니다 (256개 초과)")
기타 유용한 속성
readonly
- 이미지가 읽기 전용인지 여부를 나타내는 boolean.
pyaccess
- 픽셀 접근을 위한 PixelAccess 타입의 내부 객체.
.load()메서드에 의해 반환됨 (권장).
from PIL import Image
image = Image.new('RGB', (10, 10), 'white')
# 둘 다 동일한 객체를 반환
pixels1 = image.load()
pixels2 = image.pyaccess
print(f"load() 타입: {type(pixels1)}")
print(f"pyaccess 타입: {type(pixels2)}")
print(f"동일한 객체인가? {pixels1 is pixels2}") # True
# 하지만 load()를 사용하는 것이 권장됨
픽셀단위 접근 방법은 다음을 참고:
https://ds31x.tistory.com/465#2.-load-%EB%A9%94%EC%84%9C%EB%93%9C
Pillow 사용법 - Basic 01
Pillow 라이브러리의 기본적인 사용법을 다룬다. 2024.06.03 - [Python] - [Python] PIL, Pillow, OpenCV, and Scikit-image [Python] PIL, Pillow, OpenCV, and Scikit-imagePIL, Pillow, OpenCV, and Scikit-imagePython에서 이미지를 다룰 때
ds31x.tistory.com
728x90
'Python' 카테고리의 다른 글
| ipynb 파일 (IPython NoteBook) (5) | 2025.07.17 |
|---|---|
| [Py] double asterisk 사용법-packing and unpacking (1) | 2025.07.16 |
| [Ex] PyAutoGUI - MessageBox (0) | 2025.07.15 |
| [Ex] PyAutoGUI - hotkey 조합 입력하기 (0) | 2025.07.15 |
| [Ex] PyAutoGUI - 화면 캡처 및 이미지 인식 (0) | 2025.07.15 |