喜大普奔,之前写的爬歌工具,阅读超过10W,同时在线使用人数超过100人。。。
在众多同事及好友的邀请下,继续出炉了这个图片合成的脚本工具。
实现了分辨率、处理目录、批量处理参数的自定义,不同大小图片九宫格1秒合成!!
使用了这三个库
定义了两个函数,第一个是收集目录下图片的集合
第二个函数是将收集的图片进行大小调整,使长宽一致后可以粘合在一块。
【以下是成品展览:】
--==--==--
【善于自定义的可以取源码,直接拿来即用,1秒合成则取文章底部打包好的工具】
# -*- coding:utf-8 -*-
import os
import time
from PIL import Image
# global Image_path, Image_size, Image_row, Image_column, Image_format, Image_save_path
global another_path
Image_path = r'E:\待处理图片\\' # 图片集地址
Image_format = ['.jpg', '.JPG'] # 预设图片的格式
Image_size = 256 # 每张图片大小,最终影响的是分辨率 256*256
Image_row = 3 # 图片间隔,也就是合并成一张图后有几行
Image_column = 3 # 图片间隔,也就是合并成一张图后有几列
Image_save_path = 'E:\\待处理图片\\final.png' # 最终形成的图片
while 1:
is_exist = input(r'①请确认电脑是否已经有E:\待处理图片 或替换了路径,是/否: ')
another_path = None
if is_exist.strip() == '是':
print(' 恭喜!路径OK.')
break
else:
print(' ~~~您可以替换路径,替换后需确认答复“是”~~~')
another_path = input(r' 请输入您的正确图片地址,必要时,路径中每个文件夹都以\\隔开: ')
if not another_path:
print('您必须输入新路径的地址@huzk')
another_path = False
if '\\' in another_path[-1]: # 处理路径未以\结尾的异常
Image_path = another_path
else:
Image_path = another_path + '\\'
Image_save_path = Image_path + 'final.png' # 图片目录变更,应同时修改存储的绝对路径
need_size = input(
'②您是否需要更改成更高分辨率,如有请直接输入,输入666即表示为666*666的分辨率[按Enter直接跳过]. ')
if need_size:
Image_size = int(need_size.strip())
print(' 切换分辨率成功~~~')
need_row = input('③请输入几行,合成图片默认三行[无更改,则按Enter直接跳过] ')
need_column = input('④几列,合成图片默认三列[无更改,则按Enter直接跳过] ')
if need_row:
Image_row = int(need_row.strip())
if need_column:
Image_column = int(need_column.strip())
update_line = []
update_line.append(Image_path) if another_path is not None else print(' ☞没有变更路径')
update_line.append(Image_size) if need_size else print(' ☞没有变更分辨率(固定高宽)')
update_line.append(Image_row) if need_row else print(' ☞没有变更图片行数')
update_line.append(Image_column) if need_column else print(' ☞没有变更图片列数')
print('\n\n 全部配置已更新:' + str(update_line)) if len(update_line) != 0 else print(' 使用的是默认配置')
def reconfirm():
# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(Image_path) for item in Image_format if
os.path.splitext(name)[1] == item]
# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(image_names) != Image_row * Image_column:
print('Warn!!!Pictures nums appear some problems.') # 图片数量上出现问题,请重置Image_row和Image_column
raise ValueError('\n!合成图片的参数和要求的数量不能匹配!\n')
else:
return image_names
# 定义图像拼接函数
def New_Image(name):
to_image = Image.new('RGB', (Image_column * Image_size, Image_row * Image_size)) # 定义的新图
# 循环遍历,把每张图片按顺序黏贴到对应位置上
for y in range(1, Image_row + 1):
for x in range(1, Image_column + 1):
from_image = Image.open(Image_path + name[Image_column * (y - 1) + x - 1]).resize(
(Image_size, Image_size), Image.Resampling.LANCZOS
)
to_image.paste(from_image, ((x - 1) * Image_size, (y - 1) * Image_size))
return to_image.save(Image_save_path) # 保存此图
if __name__ == '__main__':
# print(changes_attr())
names = reconfirm()
if names:
New_Image(names) # 运行看看
else:
print('图片数量或者名称获取出错, 须符合预设格式jpg...')
# New_Image()
print('~~~\n运行完成,三秒后自动关闭窗口. ')
for i in range(3)[::-1]:
print(f'窗口关闭倒计时: {i + 1} 秒!')
time.sleep(1)
笔者使用的是python3,如果电脑编译环境不同,请直接取工具:
Tips:合成图片请在合理数字范围内命名,或者按名称顺序创建对应待合成图片
目前仅支持windows环境使用。
考虑后期付费支持国内第一图像识别的开放API,来AI优化图像。