본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] 여러 파일에 이미지 삽입하기 + 이미지 크기 변경(Pillow)

반응형

 

 

  이번 업무자동화 포스팅은 여러 엑셀 파일에 동일한 이미지를 삽입하는 방법에 대해 포스팅한다. 이전에 파일명에 따라 이미지를 엑셀에 불러오는 업무자동화 포스팅을 작성한 적이 있다. 관심있는 사람은 아래 링크를 참고

 

2021.08.30 - [코딩/업무자동화] - [파이썬/업무자동화] 엑셀에 입력 된 파일명 따라 이미지 삽입하기 - openpyxl

 

[파이썬/업무자동화] 엑셀에 입력 된 파일명 따라 이미지 삽입하기 - openpyxl

이번 업무자동화 포스팅은 엑셀 파일에 이미지를 삽입하는 방법에 대한 것이다. openpyxl 라이브러리는 각 셀에 데이터를 입력하는 것 말고도 이미지를 불러올 수도 있다. 1. 기본 사용법 : openpyxl

ybworld.tistory.com

 

  여러 파일에 이미지를 삽입하는 방법을 포스팅하기 전에 이미지의 크기를 변경할 수 있는 라이브러리가 있어 사용법을 정리해본다. PIL (Python Image Library)라는 라이브러리이다. 이 라이브러리를 사용하면 이미지를 수정할 수 있다.

 

 

 

1. PIL 사용법 (이미지 크기 조절)

 

  먼저 이미지 크기를 조절하는 방법에 대해 알아보도록 하자. 이번에 연습할 대상으로 아래 이미지를 사용할 것이다. 파일명은 "cat_and_piano.jpg"이다.

 

cat_and_piano.jpg

 

이미지의 크기는 1036*698로 확인할 수 있다.   

 

 

1) image 크기 읽어오기

 

 

먼저 PIL을 통해 이미지의 크기를 읽어오도록 해보자.

 

 

<코드>

from PIL import Image

#image 경로
img_path = r"C:\Users\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입\pilllow 연습\cat_and_piano.JPG"

#img 객체 생성
img = Image.open(img_path)

#img 사이즈 출력
print("이미지의 크기 : ", img.size)

 

<결과>

 

  결과는 가로,세로 크기가 튜플로 출력된다.

 

이미지의 크기 :  (1036, 689)

 

 

2) image 크기 조절하기(resize)

 

 

  image의 크기는 resize 메서드를 통해 수정할 수 있다. 1036*689의 크기를 800*430으로 수정해보도록 하자.

 

 

<코드>

#img 객체 생성
img = Image.open(img_path)

#img 객체를 resize 후 새로운 객체 생성
resize_image = img.resize((800,430))

#수정 후 이미지 크기 출력
print("수정 후 이미지크기 : ", resize_image.size)

 

<결과>

수정 후 이미지크기 :  (800, 430)

 

 

3) 수정 한 이미지 저장하기(save)

 

 

  수정 한 이미지는 객체의 save 함수를 통해 저장할 수 있다. 아래 .save 함수의 사용법을 참고해보자.

 

#image 저장
~~~.save(저장할 경로 및 파일명, 이미지 저장 형태, 이미지 품질)

 

 

<코드>

#이미지 resize
resize_image = img.resize((800,430))

#resize한 이미지 저장
resize_image.save(save_path, "JPEG", quality=95)

 

<결과>

이미지 저장 결과

 

 

2. 여러 파일에 이미지 삽입하기

 

  이번 포스팅의 주제는 한 폴더에 여러 엑셀파일(동일 양식)이 있을 경우 한번에 이미지를 삽입하는 코드를 작성하는 것이다. 테스트를 위해 아래 빈 엑셀 파일 4개를 생성하였다.

 

 

  이미지는 1번에서 다뤘던 "cat_and_piano.jpg"파일을 삽입할 것이다.

 

 

1) Import

 

 

<코드>

import os
import openpyxl as op
#엑셀 이미지 삽입을 위한 openpyxl import
from openpyxl.drawing.image import Image
#openpyxl Image 클래스와 중복되므로 PIL은 pi로 설정
from PIL import Image as pi

 

  필요한 라이브러리 및 모듈을 import하였다. 주의할 점은 openpyxl.drawing.image 모듈에서 제공하는 Image 클래스와 PIL에서 제공하는 Image 클래스의 명칭이 똑같아서 PIL을 pi로 바꿔서 사용하도록 변경하였다.

 

 

2) 함수 설명

 

함수명 매개변수 설명
resizeImage size, image_path, img_name -. 이미지의 사이즈를 조절하는 함수 정의
-. size : 이미지를 조절할 사이즈
-. image_path : image가 있는 원본 위치(절대 경로 또는 상대경로)
-. img_name : image 파일명
insertImage file_path, img_path, img_name, save_path -. 이미지를 엑셀파일 설정 시트 "A1"에 불러오는 함수 정의
-. file_path : 엑셀파일이 있는 경로
-. img_path, img_name : 위와 동일
-. save_path : 결과파일을 저장할 경로

 

 

3) 함수 구현

 

 

<코드>

#사이즈를 조절하는 함수
def resizeImg(size, img_path, img_name):
    #이미지 객체 생성
    img = pi.open(img_path+"/"+img_name)
    #이미지 resize
    resize_img = img.resize(size)
    #수정한 이미지 저장
    resize_img.save(img_path+"/"+img_name, "JPEG", quality=95)

#이미지를 엑셀에 삽입하는 함수
def insertImg(file_path, img_path, img_name, save_path):
    #file_path 폴더에 파일 목록을 리스트화
    file_list = os.listdir(file_path)
    #리스트 for문 실행
    for file in file_list:
        #각 파일 openpyxl Workbook 객체 생성
        wb = op.load_workbook(file_path+"/"+file)
        #시트 설정
        ws = wb.active
        #이미지 객체 생성
        img = Image(img_path+"/"+img_name)
        #이미지를 "A1"에 추가
        ws.add_image(img, "A1")
        #엑셀 파일 저장
        wb.save(save_path+"/"+file)

 

 

4) 실행부

 

 

<코드>

if __name__ == "__main__":
    #엑셀파일 PATH
    file_path = r"C:\Users\Desktop\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입\새 폴더"
    #불러올 이미지 파일 PATH
    img_path = r"C:\Users\Desktop\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입"
    #결과파일을 저장할 PATH
    save_path = r"C:\Users\Desktop\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입\결과파일저장"
    #이미지파일명
    img_name = "cat_and_piano.JPG"
    #조절할 사이즈(500*200)
    size = (500,200)
    
    #함수 호출
    resizeImg(size, img_path, img_name)
    insertImg(file_path, img_path, img_name, save_path)

 

 

5) 결과

 

 

  각 엑셀 파일에 사이즈가 조절 된 이미지가 삽입된 것을 확인할 수 있다.

 

결과 파일

 

 

 

결과 파일 test1.xlsx 실행

 

728x90