Python으로 이미지 세로로 합치기 (웹툰형)
Python으로 이미지 합치기
포스팅 시간 기준 아래 버전들로 테스트 하였습니다.
( Windows 10 , Python 3.7.6 )
PS C:\Users\KWON> python --version
Python 3.7.6
이미지 합치기
오늘은 파이썬으로 웹툰형 이미지를 만들어 보려고 합니다.
요즘 만화들이 웹툰형태로 많이 제공되다 보니 세로형 이미지에 익숙해 지는것 같습니다.
그래서 가지고 있는 이미지를 파이썬을 이용해 세로로 합치는 방법을 알려드리려고 합니다.
위 이미지는 파이썬을 이용해 아래의 이미지들을 합친 결과파일 입니다.
코드 설명
모든 이미지 파일의 가로길이는 동일하다는 가정하에 작성되었습니다.
PIL 모듈
python 모듈중 PIL 모듈을 이용하여 이미지를 합치게 됩니다.
먼저 PIL 모듈 설치가 필요합니다. 샘플파일은 python3 버전 기준으로 작성되었습니다.
pip3 install pillow
pillow 모듈 설치후에 잘 동작하는지 확인합니다.
PS C:\Users\KWON\Desktop\dev> python
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>>
glob으로 현재 폴더 이미지 경로 모으기
target_dir = "./"
files = glob.glob(target_dir + "*.jpg")
#.\Toon_1.jpg
#.\Toon_2.jpg
#.\Toon_3.jpg
# 해당 부분에서 file 리스트 분류하는 방법은 생략하겠습니다.
# 입맛에 맞게 수정해서 사용 하세요~
이미지 파일을 Image 오브젝트 배열로 만들기
glob을 통해 얻은 이미지 경로를 Image 클래스의 오브젝트로 만들어 배열에 저장합니다.
def listImage(image_key,image_value):
image_list = []
for i in image_value:
# image_list에 이미지 파일들을 오브젝트로 입력
im = Image.open(image_key+"_"+str(i)+".jpg")
print('Get '+image_key+"_"+str(i)+".jpg")
width, height = im.size
image_list.append(im)
# 합칠 파일의 세로 길이를 미리 계산하여 combine
full_width = max(full_width, width)
full_height += height
combineImage(full_width,full_height,image_key,image_list,index)
PNG 파일 포맷은 가로, 세로 unsigned 4byte씩 기준으로 확인이 되는데
JPG 파일 포맷 (2byte x 2byte) 에 비해 담을 수 있는 pixel 수가 많습니다.
따라서 JPG로 만들 경우 픽셀수를 65535이하로 제한해야 합니다.
if full_height+height > 65000:
combineImage(full_width,full_height,image_key,image_list,index)
# 두 이미지를 합쳤을때 65000이 넘을경우 다음 파일로 생성
index = index + 1
image_list = []
full_width, full_height = 0, 0
배열의 이미지 오브젝트들 합치기
def combineImage(full_width,full_height,image_key,image_list,index):
# Image 오브젝트를 담을 새로운 Image 오브젝트를 생성합니다.
canvas = Image.new('RGB', (full_width, full_height), 'white')
output_height = 0
# Image 세로 사이즈 확인 후 이전 이미지 끝에 paste
for im in image_list:
width, height = im.size
canvas.paste(im, (0, output_height))
output_height += height
print('Start Merge image to out//'+image_key+'_merged_'+str(index)+'.jpg')
# out 폴더에 merged 이미지로 저장
canvas.save('out//'+image_key+'_merged_'+str(index)+'.jpg')
최종 코드
위 코드들을 조합한 최종 코드입니다.
Leave a comment