반응형

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

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

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

 

 

오늘은 이미지를 많이 다루고 처리하는 분들을 위해서 파이썬으로 이미지를 다룰 수 있게 해주는 Pillow라는 라이브러리에 대해서 공부해보겠습니다.

 

이번 시간에는 이미지에 워터마크를 넣는 방법을 배워보겠습니다.


 

인터넷 상에 사진이 포함된 글을 보다보면 아래와 같이 워터마크를 포함한 사진을 보신적이 있으실 거예요.

 

이런 워터마크 작업을 많이 하시는 분들은 사진들을 한 폴더에 두고, 자동으로 워터마크를 찍어주는 코드를 사용하면 참 편하겠죠?

 

 

먼저 전체 코드를 보겠습니다.

 

# step1.필요한 PIL의 모듈 3가지 import
from PIL import  Image, ImageDraw, ImageFont

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

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

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

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

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

# step7.워터마크 위치 설정
margin = 10
x = width - width_txt - margin
y = height - height_txt - margin

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

# step9.이미지 출력
img.show()

# step10.현재작업 경로에 완성 이미지 저장
img.save("cat_watermakr.jpg")

 

너무 길어서 조금 부담스러우신가요? 걱정마시고 저랑 차근차근 하나씩 살펴 보시죠.

 

step1 & step2

# 1.필요한 PIL의 모듈 3가지 import
from PIL import  Image, ImageDraw, ImageFont

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

 

우선 Pillow 라이브러리에서 필요한 친구들만 import 해줍니다.

 

Image: 이미지를 불러오고 보여주는 역할(가장 기본적이고 필수적인 모듈)

ImageDraw: 우리가 사진을 편집해 줄 그림판과 같은 역할

ImageFont: 폰트 종류와 크기 설정

 

그 다음엔 워터마크를 넣어 줄 이미지를 한장 불러온 뒤, 나중에 사용하기 위해서 이미지의 사이즈 정보도 변수에 담아줍니다.

 

 

step3 & step4

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

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

 

step3은 불러온 이미지를 그림판에 복붙해주는 느낌으로 생각하시면 됩니다. step4에서는 넣어줄 워터마크의 내용을 입력해주세요.

 

step5

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

 

가장 핵심인 5단계는 따로 떼어내서 설명드리려 합니다. 왜 핵심이냐?! 에러가 가장 많이 발생할 가능성이 높기 때문입니다.

 

아래는 구글링을 하다보면 볼 수 있는 코드입니다.

font = ImageFont.truetype('arial.ttf', 30)

 

 이 코드를 그대로 입력하셨다면 거의 99% 확률로 아래와 같은 문구의 에러가 출력됩니다.

(1%는 해당 ttf 파일이 현재 작업 경로에 들어있거나 폰트가 들어있는 디렉토리를 환경변수로 설정해둔 경우입니다.)

 

OSError: cannot open resource

 

한마디로 너가 사용하겠다는 폰트를 못찾겠다는 말입니다.

 

그렇다면 우리는 어떻게 해야할까요? 사용하고 싶은 폰트를 다운로드 받고 폰트의 위치를 컴퓨터에게 알려주면 됩니다.

 

폰트는 저작권이 무료이고, 나름 퀄리티 좋은 네이버 나눔 글꼴을 추천드립니다.

(마음에 안드신다면 무료 글꼴을 제공하는 기업들이 있으니 검색해보시길 추천드립니다)

 

https://hangeul.naver.com/2017/nanum

 

네이버 글꼴 모음

네이버가 만든 150여종의 글꼴을 한번에 만나보세요

hangeul.naver.com

 

위의 링크에서 나눔글꼴을 다운로드 받으셨다면 압축을 푸시고 폴더를 열어주세요.

 

저는 아래의 여러 글꼴들 중에서 나눔손글씨_펜 폴더 안의 NanumPen.ttf 파일을 선택했습니다.

 

 

만약 경로의 개념을 잘 몰라서 경로를 어떻게 입력해야할지 모르시겠다면, 해당 파일을 커맨드(cmd) 창에 드래그&드롭 해보세요.

 

경로가 출력된답니다. 그걸 그대로 복사해서 아래의 코드에 붙여넣으시면 됩니다. 참고로 오른쪽에 숫자는 글자 크기입니다.

 

font = ImageFont.truetype('여기 경로를 붙여넣으세요', 30)

 

<주의>

 

만약 나눔폰트가 아닌 한글을 지원하지 않는 폰트를 선정하면 아래와 같은 오류가 출력됩니다.

 

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

 

step6 & step7

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

# step7.워터마크 위치 설정
margin = 10
x = width - width_txt - margin
y = height - height_txt - margin

 

길었던 폰트 설정을 마치고 이제 해줄 부분은 워터마크의 위치에 대한 설정입니다.

 

아까 저장해뒀던 draw 객체(안에는 사진이 복붙된 그림판이 들어있음)는 textsize( ) 함수를 이용해서 텍스트의 너비와 높이 정보를 가져 올 수 있습니다.

 

이렇게 얻은 정보를 이미지 전체의 너비, 높이, 그리고 사진 구석에서 얼마나 띄울 것인지(margin)를 계산해서 워터마크의 시작위치(왼쪽위 꼭지점)의 위치를 정해줍니다.

 

step8 & step9 & step10

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

# step9.이미지 출력
img.show()

# step10.현재작업 경로에 완성 이미지 저장
img.save("cat_watermakr.jpg")

 

이제 남은 것은 그림판에 문자를 입력하고, 결과를 출력하고 저장하는 것입니다.

 

만약 글자 색상을 설정해주는 fill을 설정 해주지 않으면 'white'가 기본값으로 들어가 있으며, 이 색깔은 CSS 컬러, HEX 컬러 모두 적용 가능합니다.

 

색상은 아래의 링크를 참고해서 마음에 드시는 것으로 골라서 넣으시면 됩니다.

https://namu.wiki/w/%ED%97%A5%EC%8A%A4%20%EC%BD%94%EB%93%9C

 

마지막 step10의 경우는 저장이 필요없으시면 하지 않으셔도 됩니다.

 


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

 

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

 

반응형

+ Recent posts