반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

<Pillow 관련 글>

 

2021.11.08 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_1편.Pillow 설치 및 이미지 불러오기

2021.11.09 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_2편.이미지 크기 변경(resize), 자르기(crop), 회전(rotate), 대칭(flip), 그리고 저장(save)

2021.11.10 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_3편.이미지 흑백으로 만들기, 필터 적용(Blur, Edge)

2021.11.10 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_4편.이미지에 글자(워터마크) 추가하는 법(ft. OSError: cannot open resource)

 


 

지난 시간에는 아래와 같이 사진 하나에 '코딩유치원'이라는 워터마크를 넣는 방법을 배워보았습니다.

 

 

하지만 우리가 그림판에서도 가능한 이 작업을 굳이 파이썬을 사용해서 하는 이유는 반복적인 작업을 컴퓨터에게 부탁하기 위해서죠.

 

그래서 오늘은 지난 시간의 코드를 조금만 수정해서 지정한 폴더 내의 jpg 파일에 한꺼번에 워터마크를 넣는 방법을 배워보겠습니다.

 

1. 전체 코드

 

먼저 완성된 코드를 보여드리겠습니다. 지난 시간에 비해서 추가되거나 수정된 코드는 별도로 주석에 표시해두었으니 비교하시면서 살펴보시면 더 이해가 빠르실거예요!

 

# 1.이미지 처리에 필요한 PIL의 모듈 import
from PIL import  Image, ImageDraw, ImageFont

# (추가) 파일 경로 관련 모듈 import
import glob

# (추가) 타겟 폴더 정보 입력
file_path = '/Users/sangwoo/Desktop/img_download/'

# (추가) 타겟 폴더에서 jpg 파일의 경로들을 리스트로 저장
list_images= glob.glob(file_path + '*.jpg')

# (추가) 파일 이름 저장 시, 변경해줄 번호
i = 0

# (추가) 반복을 위한 for문
for image in list_images:

    # 2.워터마크 삽입할 이미지 불러오기
    img = Image.open(image)
    width, height = img.size

    # 3.그림판에 이미지를 그대로 붙여넣는 느낌의 Draw() 함수 
    draw = ImageDraw.Draw(img)

    # 4.삽입할 워터마크 문자
    text = "코딩유치원"

    # step5.삽입할 문자의 폰트 설정
    font = ImageFont.truetype('/Users/sangwoo/Downloads/나눔 글꼴/나눔손글씨_펜/NanumPen.ttf', 30)

    # 6.삽입할 문자의 높이, 너비 정보 가져오기
    width_txt, height_txt = draw.textsize(text, font)

    # 7.워터마크 위치 설정 (margin을 margin_x,margin_y로 나누어서 사용해도 됨)
    margin = 10
    x = width - width_txt - margin
    y = height - height_txt - margin

    # 8.텍스트 적용하기
    draw.text((x, y), text, fill='white', font=font)

    # 9.(생략) 이미지 출력
    # img.show()
    
    # (수정) 10. 지정한 폴더에 완성 이미지 저장
    i = i+1
    img.save(file_path + f'{i}.jpg')

 

 

2. 코드 설명

 

코드는 지난 시간에 비해 추가된 부분 위주로 설명드리겠습니다.

 

1) 이미지 파일의 경로 관련 코드

 

오늘은 폴더 안에 들어있는 파일들의 경로를 모두 받아 올 수 있도록 해주는 모듈인 glob 모듈을 사용합니다. 가볍게 import 해줍니다.

# (추가) 파일 경로 관련 모듈 import

import glob

 

그 다음으로는 준비한 이미지 5개가 들어있는 폴더의 경로('/Users/sangwoo/Desktop/img_download/')를 확인해주시고, 다음 코드의 file_path 변수에 여러분들의 이미지가 있는 폴더 경로를 담아줍니다.

 

그 아래의 코드는 방금 import 해준 glob 모듈의 glob 함수로 파일 경로들을 가져오는 것입니다.

 

더 자세히 설명하면, 우리가 지정한 file_path 안의 jpg 파일 경로들을 리스트로 저장하는 코드입니다.

 

# (추가) 타겟 폴더 정보 입력
file_path = '/Users/sangwoo/Desktop/img_download/'

# (추가) 타겟 폴더에서 jpg 파일의 경로들을 리스트로 저장
list_images= glob.glob(file_path + '*.jpg')

 

이미지 5개가 들어있는 폴더와 경로

 

2) 이미지 워터마크 삽입 반복문

 

이제는 지난 시간 작성했던 코드를 for 반복문 안에 넣어주어야 합니다.

 

그 전에 가장 마지막 단계에서 워터마크 삽입된 사진을 저장할 때를 위해서 i라는 변수를 만들어 0을 넣어줍니다.

(이걸 안해주고 그냥 '파일이름.jpg'로 해주면 가장 마지막 사진만 저장되는 참사가 일어날 거예요ㄷㄷ)

 

# (추가) 파일 이름 저장 시, 변경해줄 번호
i = 0

# (추가) 반복을 위한 for문
for image in list_images:


	(지난 시간의 코드와 동일)
    
    
    # (수정) 10. 지정한 폴더에 완성 이미지 저장
    i = i+1
    img.save(file_path + f'{i}.jpg')

 

다음으로는 for 문을 잠시 살펴보겠습니다.

 

for문은 아까 list_images에 담아두었던 이미지 파일들의 경로들을 하나씩 꺼내어 image라는 변수에 담아서 워터마크 작업을 반복합니다.

 

작업이 완료 되었으면 i를 1씩 상승시켜주면서 파일을 같은 폴더 내에 저장해줍니다.

 

워터마크 작업이 완료된 상태의 폴더

 

참고로 사진의 크기를 조금 달리 해봤는데, 해상도가 큰 사진은 워터마크가 비교적 작게 표현되는 한계점이 있는 코드인 듯 합니다.

 

이 부분은 삽입할 이미지의 크기에 따라서 fontsize와 margin을 수정하는 방식으로  개선할 수 있겠네요.

 


오늘 준비한 내용은 여기까지입니다.

 

오늘도 공부하시느라 고생 많으셨습니다~!

반응형

+ Recent posts