简单的python批量拖拽图片图片合成软件源代码

文章资讯 2020-04-23 21:12:17

简单的python批量拖拽图片图片合成软件源代码

开始敲代码,假如是按文件名自己排序,python会按照位数的ascii码来排序,上图会排成0 >1 >10>11> 12> 13> 14> 15 >16> 17> 18> 19 >2 >3 >4> 5> 6 >  7> 8 >9

def sort_key(s):
    # 排序关键字匹配
    # 匹配开头数字序号
    if s:
        try
            c = re.findall('(d+).(png|jpg)$', s)[0]    #文件排序的关键正则代码。找到.png或或者.jpg之前的数字来排序,从小变大。
        except:
            c = [-1]#没有正则匹配到就返回-1,按照文件名排序了
        return int(c[0])

接下来全部代码给大家欣赏,使用了python强大的PIL库

# -*- coding: UTF-8 -*-
import PIL.Image as Image
import os
import re
import filetype
path = r"C:UsersAdministratorDesktop文档和脚本文件文章20_4_22_9_48_19" #散的图片存放的位置
save_path = r"C:UsersAdministratorDesktop文档和脚本文件文章20_4_22_9_48_19" #保存的路径
save_name = r"1.png" #保存的名称
def sort_key(s):
    # 排序关键字匹配
    # 匹配开头数字序号
    if s:
        try:
            c = re.findall('(d+).(png|jpg)$', s)[0]    #文件排序的关键正则代码。找到.png或或者.jpg之前的数字来排序,从小变大。
        except:
            c = [-1]#没有正则匹配到就返回-1,按照文件名排序了
        return int(c[0])
 
def new_img(x_len,all_y_len,bs):
    to_image = Image.new('RGB', (x_len, all_y_len), "#FFFFFF")#创建一个很大的白底图片,最大高度为所有图片的高度和,宽度是所有图片中最长的宽
    y_size = 0
    bs.sort(key=sort_key)#再进行排序,好像函数传递,排序会乱
    for i in bs:
        print(i)
        img1 = Image.open(i) #读取文件
        one_x_len = img1.size[0]#获取单个图片的宽度,就是横着的
        l_side = x_len - one_x_len#求单个图片宽度与大的白底图片的宽度差,就是要把图片放在正中间。
        if l_side > 0:
            move_len = int(l_side / 2)#求出左移距离
        else:
            move_len = 0
        print( "右移像素:" + str(move_len)+ "n")
        to_image.paste(img1, (move_len, y_size))#进行图片粘贴,把每一张图片按照顺序一张张往下粘贴。
        y_size += img1.size[1]#y轴距离依次相加
 
    to_image.save(save_path + '/' + save_name)#粘贴完成,保存图片到你指定的路径
    print('执行完成' + "n")
def merge_img(files):
    bs = files
    bs.sort(key=sort_key)#排序
    all_y_len = 0
    x_len = 0
    for k in bs:
        kind = filetype.guess(k)
        if (kind.extension == 'jpg' or kind.extension == 'png'):#判断每一张图片是不是jpg,和png
            # print()
            img1 = Image.open(k)
            # print(img1.size[1])
            all_y_len += img1.size[1]#计算图片高度
            if img1.size[0] > x_len:
                x_len = img1.size[0] #计算图片最大宽度
 
 
        else:
            print("警告", "您拖放的文件不是jpg,png文件")
            return
    print('合成总像素长度' + str(all_y_len) + "n图像最大宽:" + str(x_len) + "n")
    new_img(x_len, all_y_len, bs)
 
file_list = []
for filename in os.listdir(path):#边路路径下所有的图片
    file_list.append(path+"\"+filename)
print(file_list)
merge_img(file_list)#调用函数拼接

接下来想把这个功能想做成pc端的工具,直接亮代码,不写过多的注释了,可以自己改一些功能吧,我自己实现了批量拖拽合成。

# -*- coding: UTF-8 -*-
import PIL.Image as Image
import tkinter as tk
from tkinter.messagebox import showinfo,askyesno
from tkinter import END
import windnd
import re
import filetype
import os
 
def mkdir(path):
    path = path.strip()
    path = path.rstrip("\")
    isExists = os.path.exists(path)
    if not isExists:
        os.makedirs(path)
        return True
    else:
        return False
 
def sort_key(s):
    # 排序关键字匹配
    # 匹配开头数字序号
    if s:
        try:
            c = re.findall('(d+).(png|jpg)$', s)[0]    #文件排序的关键正则代码。找到.png或或者.jpg之前的数字来排序,从小变大。
        except:
            c = -1
        return int(c[0])
def new_img(x_len,all_y_len,bs):
    token = var_token.get()
    var_file = var_r.get()
    if token=='':
        token = "1.png"
    if var_file == '':
        var_file = "D:Pictures"
        mkdir(var_file)
    to_image = Image.new('RGB', (x_len, all_y_len), "#FFFFFF")
    y_size = 0
    bs.sort(key=sort_key)
    for i in bs:
        print(i)
        img1 = Image.open(i)
        one_x_len = img1.size[0]
        l_side = x_len - one_x_len
        if l_side > 0:
            move_len = int(l_side / 2)
        else:
            move_len = 0
        show_text.insert(END, '拼接' +str(i)+ "n")
        #show_text.insert(END, "右移像素:" + str(move_len)+ "n")
        to_image.paste(img1, (move_len, y_size))
        y_size += img1.size[1]
 
    to_image.save(var_file + '/' + token)
    show_text.insert(END, '执行完成' + "n")
def dragged_files(files):
    image_names = []
    bs = [str(x, encoding="gbk") for x in files]
 
    bs.sort(key=sort_key)
 
    msg = "n".join( bs)
    #print(len(msg))
    if(len(msg))>3000:
        msg = msg[0:3000]+"n...n...n"+ msg[-100:-1]
    a = askyesno('您拖放的文件', msg+'n要执行拼接操作吗')
    if a:
        #print(files)
        bs = [str(x, encoding="gbk") for x in files]
 
        img_row = len(bs)#有多少张图片
        show_text.insert(END,"总共有"+str(img_row)+"张图片n")
        all_y_len = 0
        x_len = 0
        y_size = 0
        for k in bs:
            kind = filetype.guess(k)
            #print(kind.extension)
            #print(type(kind.extension))
            if(kind.extension =='jpg' or kind.extension =='png'):
                #print()
                img1 = Image.open(k)
                #print(img1.size[1])
                all_y_len += img1.size[1]
                if img1.size[0] > x_len:
                    x_len = img1.size[0]
 
 
            else:
                showinfo("警告", "您拖放的文件不是jpg,png文件")
                return
        show_text.insert(END, '合成总像素长度' + str(all_y_len) + "n图像最大宽:"+str(x_len)+"n")
        new_img(x_len, all_y_len, bs)
 
 
 
 
 
 
window =  tk.Tk()
window.title("图片合成工具3.0-吾爱破解-打字的小强")  # 窗口标题
window.geometry("1080x960")  # 窗口大小,中间是英文x,而不能是运算符*,很搞笑
 
windnd.hook_dropfiles(window,func = dragged_files)
tk.Label(window, text="文件夹只能包含jpg或者png文件。保存文件名要包含jpg,png后缀n不填写图片合成文件保存路径默认保存路径:D:Picturesn不填写图片合成文件保存名称默认保存路径:1.pngn报错重新打开软件尝试。",
         font=("宋体", 20)).place(x=50, y=20)
tk.Label(window, text="合成文件保存名称:", font=("宋体", 20)).place(x=10, y=200)
tk.Label(window, text="合成文件保存路径:", font=("宋体", 20)).place(x=460, y=200)
# Text组件用于显示和处理多行文本。我用来展示程序的运行状态,输出到这个组件里面
show_text = tk.Text(width=150,height=50)
show_text.place(x=10, y=250)
 
 
var_token = tk.StringVar()
var_r = tk.StringVar()
# Entry输入框,输入的值必须要定义
entry_token = tk.Entry(window, textvariable=var_token)
entry_token.place(x=260, y=200)
entry_ru = tk.Entry(window, textvariable=var_r)
entry_ru.place(x=760, y=200)
tk.mainloop()
 
##python -m PyInstaller ****.py