开始敲代码,假如是按文件名自己排序,python会按照位数的ascii码来排序,上图会排成0 >1 >10>11> 12> 13> 14> 15 >16> 17> 18> 19 >2 >3 >4> 5> 6 > 7> 8 >9
接下来全部代码给大家欣赏,使用了python强大的PIL库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])
接下来想把这个功能想做成pc端的工具,直接亮代码,不写过多的注释了,可以自己改一些功能吧,我自己实现了批量拖拽合成。# -*- 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)#调用函数拼接
# -*- 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