【小工具】用PIL算法库制作出图片合成工具

喜大普奔,之前写的爬歌工具,阅读超过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优化图像。

https://pan.baidu.com/s/1bi1Ana0W3cmksXcmSCMlgQ?pwd=wynb

猜你喜欢

转载自blog.csdn.net/qq_17195161/article/details/129254873