I made a program to merge images and I want to upgrade this program that the total height of the images should be less than 2450 pixel and save each merged images.
import os
import tkinter.ttk as ttk
import tkinter.messagebox as msgbox
from tkinter import * # __all__
from tkinter import filedialog
from PIL import Image
# add file
def add_file():
files = filedialog.askopenfilenames(title="이미지 파일을 선택하세요", \
filetypes =(('jpg 파일', '*.jpg'), ('모든 파일', '*.*')), \
initialdir='D:/jh/사업/프로그램/파이썬 이미지 합치기 프로그램/image')
# file list that user can select
for file in files:
list_file.insert(END, file)
# file frame(file add, selected file delete)
file_frame = Frame(root)
file_frame.pack(fill='x', padx=5, pady=5)
btn_add_file = Button(file_frame, padx=5, pady=5, width=12, text='파일추가', command=add_file)
btn_add_file.pack(side='left')
btn_del_file = Button(file_frame, padx=5, pady=5, width=12, text='선택삭제', command=del_file)
btn_del_file.pack(side='right')
# list frame
list_frame = Frame(root)
list_frame.pack(fill='both', padx=5, pady=5)
scrollbar = Scrollbar(list_frame)
scrollbar.pack(side='right', fill='y')
list_file = Listbox(list_frame, selectmode='extended', height=12, yscrollcommand=scrollbar.set)
list_file.pack(side='left', fill='both', expand=True)
scrollbar.config(command=list_file.yview)
.....
dest_path = os.path.join(txt_dest_path.get(), txt_file.get())
# txt_file get values after to input entry for file name. ex) desk
result_img.save(dest_path) #save result_img to dest_path
msgbox.showinfo('알림', '작업이 완료되었습니다.')
in this coding, list_file is Listbox and there are several images which are the same widths but are different heights. I want to merge this image but the height of the merged image should not over 2450 pixel.
for example, list_file is a0, a1, a2, a3, a4, a5, a6. And height of images in list_file is 200, 1500, 2400, 100, 300, 500, 1600. Then list_file should a0 <-(a0+a1), a1<-(a2), a2<-(a3, a4, a5), a3<-(a6) [1700, 2400, 900, 1600]
And I want to get entry value and save each images of list_file. For example entry value is desk, the file name should be desk 001.jpg, desk 002.jpg, desk 003.jpg, desk 004.jpg, etc.
You can use Image.new(...)
to create the merged image and then use Image.paste(...)
to copy the required images into the merged image:
def merge_images(imagelist, width, height, seqno):
if imagelist:
# create the merged image
merged_image = Image.new('RGB', (width, height), (0,0,0))
y = 0
for image in imagelist:
merged_image.paste(image, (0, y))
y += image.height
# save the merged image
dest_path = os.path.join(txt_dest_path.get(), 'desk%03d.jpg' % seqno)
merged_image.save(dest_path)
seqno += 1
return seqno
def merge():
MAX_HEIGHT = 2450
merge_list = []
height = 0
width = None
seqno = 1
for file in list_file.get(0, 'end'):
image = Image.open(file)
if width is None:
width = image.width
if height+image.height <= MAX_HEIGHT:
merge_list.append(image)
height += image.height
else:
seqno = merge_images(merge_list, width, height, seqno)
merge_list = [image]
height = image.height
merge_images(merge_list, width, height, seqno)