QR 코드에 이미지 삽입하기: pillow 패키지 활용
이번에는 pillow 패키지를 사용하여 QR 코드에 이미지를 삽입해 보겠습니다. pillow 패키지를 사용하여 이미지를 삽입하는 방법은 qrcode 패키지를 사용하는 것보다 복잡하지만, 삽입할 이미지의 크기나 위치 등을 자유롭게 지정할 수 있다는 장점이 있습니다.
여기서는 QR 코드의 오른쪽 아래 모서리에 전화 아이콘을 삽입하겠습니다. 아이콘을 자연스럽게 처리하려면 QR 코드의 내부에 적당한 여백을 두는 것이 좋겠죠? pillow 패키지는 이미지를 삽입할 위치를 (x, y) 좌표로 전달하며 QR 코드, 삽입할 아이콘, 여백의 크기를 고려해서 좌표를 설정해야 합니다.

비주얼 스튜디오 코드에서 새로운 파일에서 새로운 파일을 만들고, 파일명을 'step_3_2.py'로 지정하세요. 다음 코드를 입력한 뒤, 대화형 창에서 실행하세요. 'output' 폴더에 QR 코드가 'step_3_2.png' 파일로 저장됩니다.
from pathlib import Path
from PIL import Image
from step_1_1 import IN_DIR, OUT_DIR # 이전에 작성한 모듈을 불러옵니다.
from step_2_2 import OUT_2_2_PNG
OUT_3_2 = OUT_DIR / f"{Path(__file__).stem}.png"
if __name__ == "__main__":
qr = Image.open(OUT_2_2_PNG).convert("RGBA") # QR 코드 # 9
width_qr, height_qr = qr.size # QR 코드의 (가로, 세로) 크기
icon = Image.open(IN_DIR / "phone.png") # 전화 아이콘 # 12
width_icon = int(width_qr * 0.2) # 아이콘 가로 크기
height_icon = int(height_qr * 0.2) # 아이콘 세로 크기
icon_resized = icon.resize((width_icon, height_icon)) # 아이콘 크기 조정 # 15
pad = 50 # 여백
icon_x = width_qr - width_icon - pad # 아이콘 x 좌표 # 18
icon_y = height_qr - height_icon - pad # 아이콘 y 좌표 # 19
qr.paste(icon_resized, box=(icon_x, icon_y), mask=icon_resized) # 아이콘 삽입 #21
qr.save(OUT_3_2) # 파일로 저장
실행결과

09 pillow 패키지를 사용해서 이미지를 삽입할 때는 두 이미지의 색상 모드가 일치해야 합니다. 함수 convert()를 사용해서 이전에 생성한 QR 코드의 모드를 RGBA로 변환합니다.
12 변수 icon에 전화 아이콘을 불러와 저장합니다.
15 함수 resize()를 사용해서 아이콘의 가로세로 크기를 QR 코드의 20%로 저장합니다. 이때 크기는 픽셀 단위이므로 함수 int()를 사용하여 정수로 변환합니다.
18~19 아이콘을 삽입할 위치를 계산하여 (x, y) 좌표로 저장합니다.
21 함수 paste()를 사용해서 QR 코드 위에 전화 아이콘을 삽입합니다. 매개변수 box에는 아이콘을 삽입할 위치를 좌표로 전달하고, mask에는 삽입할 아이콘 이미지를 전달하여 아이콘 이외의 이미지를 숨깁니다.
pillow 패키지는 이미지를 다루는 데 특화되어 있습니다. 따라서 섬세한 조정이 필요한 작업은 QR 코드의 기본 함수보다는 pillow 패키지를 사용하는 것이 좋습니다.
파이썬은 방대한 커뮤니티를 기반으로 다양한 패키지를 제공합니다, 쓸모에 따라 적절한 패키지를 불러올 수 있다면 시간과 노력을 절약할 수 있습니다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
| 웹의 작동 원리 이해하기 (1) | 2025.12.30 |
|---|---|
| 웹의 작동 원리 - 실습 환경 준비하기 (0) | 2025.12.27 |
| QR 코드에 이미지 삽입하기 (0) | 2025.12.21 |
| vobject 패키지 (0) | 2025.12.17 |
| 연락처를 QR 코드로 만들기 (0) | 2025.12.14 |