이미지의 기본 개념과 Pillow 라이브러리를 사용하여 이미지를 처리하는 방법에 대해 알아봅니다.
색상과 RGBA 값
컴퓨터는 이미지의 색상을 RGBA 값으로 표현합니다. 이는 각각 Red, Green, Blue, Alpha를 의미하며, 0부터 255까지의 정수로 지정됩니다. 여기서 Alpha 값은 투명도를 나타냅니다. 예를 들어, 완전히 불투명한 빨간색은 (255, 0, 0, 255)로 표현되고, 투명한 검정색은 (0, 0, 0, 0)입니다.
Pillow에서는 HTML과 동일한 표준 색상 이름을 지원합니다. 특정 색상을 쉽게 사용하기 위해 ImageColor.getcolor() 함수를 제공합니다. 이를 통해 색상 이름을 입력하면 해당 RGBA 값을 반환받을 수 있습니다.
from PIL import ImageColor
print(ImageColor.getcolor("red", "RGBA")) # 출력: (255, 0, 0, 255)
좌표와 박스 튜플
이미지 내의 픽셀 위치는 x와 y 좌표로 지정됩니다. 원점(0, 0)은 이미지의 왼쪽 상단에 위치하며, x는 오른쪽으로 증가하고 y는 아래쪽으로 증가합니다. 많은 Pillow 함수들은 네 개의 좌표로 구성된 박스 튜플을 필요로 합니다. 이는 순서대로 왼쪽, 위, 오른쪽, 아래 좌표를 나타내며, 오른쪽과 아래는 포함되지 않습니다.
box = (50, 50, 150, 150) # (왼쪽, 위, 오른쪽, 아래)
이미지 로드 및 저장
이미지는 Image.open() 메서드를 통해 로드할 수 있습니다. 로드된 이미지는 Image 객체로 표현되며, 이를 통해 다양한 변환 작업을 수행할 수 있습니다.
from PIL import Image
image = Image.open("example.png")
image.save("output.jpg") # 다른 형식으로 저장 가능
새로운 이미지를 생성하려면 Image.new() 메서드를 사용합니다. 첫 번째 인자는 색상 모드, 두 번째는 크기, 세 번째는 배경색을 지정합니다.
new_image = Image.new("RGBA", (200, 200), (255, 255, 255, 255))
이미지 자르기
crop() 메서드를 사용하여 이미지의 특정 영역을 잘라낼 수 있습니다. 이 메서드는 박스 튜플을 입력으로 받으며, 새로운 Image 객체를 반환합니다.
cropped_image = image.crop((50, 50, 150, 150))
이미지 복사 및 붙여넣기
copy() 메서드를 통해 기존 이미지를 복제할 수 있으며, paste() 메서드를 사용하여 한 이미지를 다른 이미지 위에 붙여넣을 수 있습니다.
copied_image = image.copy()
another_image = Image.open("another.png")
copied_image.paste(another_image, (100, 100))
이미지 크기 조정
resize() 메서드를 사용하여 이미지의 크기를 변경할 수 있습니다. 이 메서드는 새로운 Image 객체를 반환합니다.
resized_image = image.resize((300, 300))
이미지 회전 및 반전
rotate() 메서드를 통해 이미지를 회전시킬 수 있으며, transpose() 메서드를 사용하여 이미지를 좌우 또는 상하로 반전할 수 있습니다.
rotated_image = image.rotate(90)
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
단일 픽셀 수정
getpixel() 및 putpixel() 메서드를 사용하여 특정 픽셀의 색상을 읽고 수정할 수 있습니다.
pixel_value = image.getpixel((10, 10))
image.putpixel((10, 10), (255, 0, 0, 255))
이미지에 도형 그리기
ImageDraw 모듈을 사용하여 이미지에 선, 사각형, 원 등의 도형을 그릴 수 있습니다.
from PIL import Image, ImageDraw
img = Image.new("RGB", (200, 200), "white")
draw = ImageDraw.Draw(img)
# 직선 그리기
draw.line([(50, 50), (150, 150)], fill="blue", width=2)
# 사각형 그리기
draw.rectangle([50, 50, 150, 150], fill="red", outline="black")
# 타원 그리기
draw.ellipse([60, 60, 140, 140], fill="yellow", outline="green")
이미지에 텍스트 추가
ImageDraw 모듈의 text() 메서드를 사용하여 이미지에 텍스트를 추가할 수 있습니다. 또한 ImageFont.truetype() 메서드를 통해 글꼴을 지정할 수 있습니다.
from PIL import Image, ImageDraw, ImageFont
img = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 36)
draw.text((50, 50), "Hello, World!", fill="black", font=font)