为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶不菲 2023-03-22 16:48:53
我做了一个合并图像的程序,我想升级这个程序,使图像的总高度应小于 2450 像素,并保存每个合并的图像。import osimport tkinter.ttk as ttkimport  tkinter.messagebox as msgboxfrom tkinter import *    # __all__from tkinter import filedialogfrom PIL import  Image# add filedef add_file():files = filedialog.askopenfilenames(title="이미지 파일을 선택하세요", \    filetypes =(('jpg 파일', '*.jpg'), ('모든 파일', '*.*')), \    initialdir='D:/jh/사업/프로그램/파이썬 이미지 합치기 프로그램/image')    # file list that user can selectfor 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 framelist_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,文件名应为desk 001.jpg、desk 002.jpg、desk 003.jpg、desk 004.jpg等。
查看完整描述

1 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

您可以使用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)


查看完整回答
反对 回复 2023-03-22
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号