使用 python、tkinter 合并条件小于 2450 像素的图像

to merge images with condition less than height 2450 pixel by using python, tkinter

我做了一个合并图片的程序,我想升级这个程序,让图片的总高度小于 2450 像素,并保存每个合并的图片。

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('알림', '작업이 완료되었습니다.') 

在这个编码中,list_file是Listbox,有几张相同宽度但不同高度的图像。我想合并这张图片,但合并后的图片高度不能超过2450像素。

例如list_file是a0,a1,a2,a3,a4,a5,a6。而list_file中图片的高度是200, 1500, 2400, 100, 300, 500, 1600。那么list_file应该是a0 <-(a0+a1), a1<-(a2), a2< -(a3, a4, a5), a3<-(a6) [1700, 2400, 900, 1600]

我想获取条目值并保存 list_file 的每个图像。例如输入值为desk,文件名应为desk001.jpg、desk002.jpg、desk003.jpg、desk004.jpg等

您可以使用Image.new(...)创建合并图像,然后使用Image.paste(...)将所需图像复制到合并图像中:

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)