Python实现千图成像工具:从GUI设计到打包部署完整指南

小满
小满
发布时间:2026-10-15| 4人浏览过
原创

本文详细介绍如何使用Python实现千图成像工具。通过PySimpleGUI构建图形界面,利用PIL和numpy进行图片尺寸调整与合成,并讲解如何将脚本打包为.exe可执行文件。内容涵盖界面设计、核心算法逻辑及常见打包报错处理,适合希望快速制作图片合成工具的开发者参考。

千图成像技术是指利用N张独立图片拼接合成一张新图片的视觉效果。目前实现该效果的方法众多,常见的工具有Photoshop、懒人图云以及foto-mosaik-edda等。

千图成像的效果主要可分为两类:第一类是直接利用N张图片,根据底图的像素颜色和尺寸,逐张拼合构成底图,例如foto-mosaik-edda的实现方式;第二类则是利用N张图片,根据底图的像素尺寸,生成一张与底图大小相近的图片,再将其与底图进行透明度合成,例如Photoshop的处理方式。

第一种方式属于严格意义上的千图成像,但如果选用的图片颜色与底图像素匹配度不足,生成的图像可能会显得扭曲;若选图精良,最终效果极佳。第二种方式效果相对平淡,但对选图要求较低,生成的图像外观较为自然。

两种方法各有优劣,本文旨在使用Python实现第二种方法,并最终开发为图形用户界面(GUI)程序。

前置准备

本文采用PySimpleGUI进行GUI界面设计,使用PIL、numpy和random库进行图片处理,并使用os库进行文件操作:

import PySimpleGUI as sg
from PIL import Image
import os
import numpy as np
import random

相关依赖库可通过pip命令安装:

pip install 库名

GUI制作

为了提升使用便捷性,避免重复运行代码,我们在原有程序基础上开发GUI界面,并最终打包为.exe可执行文件。

GUI界面设计

GUI界面的功能设定主要包含以下五项:

  • 选择底图功能
  • 选择组图功能
  • 事件展示区域
  • 启动工具按钮
  • 退出工具按钮

最终设计的界面代码如下:

# 主题设置
sg.theme('LightBrown3')

# 布局设置
layout = [
    [sg.Frame(layout=[
        [sg.InputText(key='image_file', size=(32, 1), font=("微软雅黑", 10), enable_events=True),
        # 设定能选择的图片格式
         sg.FileBrowse('选择底图',
                       file_types=(("Text Files", "*.png*"), ("Text Files", "*.jpg*"), ("Text Files", "*.jpeg*")),
                       font=("微软雅黑", 12)),

         sg.Button('选择组图', font=("微软雅黑", 12)),
         ],
    ],
        title='内容选择', title_color='blue', font=("微软雅黑", 10), relief=sg.RELIEF_SUNKEN, )],
    [sg.Frame(layout=[
        [sg.Output(size=(51, 10), font=("微软雅黑", 10))],
    ],
        title='信息展示', title_color='blue', font=("微软雅黑", 10), relief=sg.RELIEF_SUNKEN, )],

    [sg.Button('开始生成', font=("微软雅黑", 12)),
     sg.Text('', font=("微软雅黑", 12), size=(27, 0)), sg.Button('退出程序', font=("微软雅黑", 12), button_color='red')]
]
# 创建窗口
window = sg.Window('千图成像', layout, font=("微软雅黑", 12), default_element_size=(80, 1))
while True:
    # 退出按钮
    event, values = window.read()
    if event in (None, '退出程序'):
        break
window.close()

界面效果如下:

GUI界面效果

逻辑设计

在获取图片时,由于支持路径输入,可能存在保存路径问题,因此此处增加了判断逻辑;最终将获取到的图片路径存入列表中。

if event == 'image_file':
    files = values['image_file']
    if os.path.exists(files):
        img_Main_file.append(files)
    else:
        print('图片不存在,请重新选择图片!')
        # 弹窗
        sg.popup('图片不存在,请重新选择图片!')

获取组图所在文件夹路径,同样将得到的路径存入列表中:

if event == '选择组图':
    files = sg.popup_get_folder('请选择选择组图路径:')
    if os.path.exists(files):
        img_secondary_file.append(files)
    else:
        print('文件不存在,请重新选择文件')
        sg.popup('文件不存在,请重新选择文件')

启动按钮点击时,将两个列表传入图片处理函数中:

if event == '开始生成':
    if len(img_Main_file) and len(img_secondary_file) != 0:
        img_save(img_Main_file, img_secondary_file)
    else:
        sg.popup('未选择!')

图片处理

由于无法保证所有图片尺寸一致,因此需要进行相应处理。图片处理主要依赖PIL和numpy库。

修改底图大小

我们将底图视为“容器”,其尺寸决定了组成图片的数量及清晰度。提取的底图高宽越多,图片越大且越清晰;通常提取底图10%的大小,该数值可适当增大,但建议不超过30%。

open_img = Image.open('./底图.jpg')
# 获取图片本身宽度、高度
width, height = open_img.size
# 重新计算底图高宽,加大底图的像素。取出底图的10%的高宽,用int进行取整
Increase_width = int(width * 0.10) * int(height * 0.10)
Increase_height = ((Increase_width / width) * height // round(height * 0.10)) * round(height * 0.10)
# 更改为重新计算的大小
open_img = open_img.resize((int(Increase_width), int(Increase_height)), Image.ANTIALIAS)

修改组图大小

将组成图片的尺寸调整为底图的10%,该数值也可适当增大:

# 读取文件路径下的图片,并修改大小
img_matrix = []
for e in os.listdir('./image'):
    # 防止文件夹中出现并图片格式的文件
    try:
        img_matrix.append(np.array(Image.open(os.path.join(str(img_files_list[0]), e)).convert('RGB').resize(
            (int(width * 0.10), int(height * 0.10)), Image.ANTIALIAS)))
    except OSError as e:
        print(e)

计算图片填充次数

前文提到,底图尺寸决定了组成图片的数量,以下代码根据底图尺寸及组成图片尺寸,计算主图能填充多少张图片:

# 计算主图高宽能填充多少图片
width_picture_Fill_frequency = int(Increase_width / int(width * 0.10))
height_picture_Fill_frequency = int(Increase_height / int(height * 0.10))

组图合成

根据底图高宽的10%及图片填充次数得出矩阵,随后将组图随机填充至矩阵中:

array_img = np.zeros_like(np.array(open_img))
for i in range(width_picture_Fill_frequency):
    for x in range(height_picture_Fill_frequency):
        array_img[x * int(height * 0.10):(x + 1) * int(height * 0.10),
        i * int(width * 0.10):(i + 1) * int(width * 0.10), :] = random.choice(img_matrix)
array_img = Image.fromarray(array_img)

生成的图片清晰度较高,但在手机屏幕上查看可能略显模糊:

组图效果

图片合成

将底图与组图进行合并,alpha参数用于调整两者透明度,最佳取值通常为0.7、0.8或0.9。

img = Image.blend(array_img, open_img, alpha=0.8)  # 0.7,0.8,0.9
img.save('千图成像.jpg')

图片效果

GUI打包

打包可直接使用pyinstaller进行安装;若不熟悉打包操作或命令行,可参考前文介绍的打包工具,该工具能简单满足打包需求。

使用pyinstaller库打包时,启动命令行窗口,cd进入文件所在目录,最后使用以下命令进行打包:

pyinstaller -F -w 名称.py

打包时可能会遇到报错:

报错示例

该报错源于hook-sqlalchemy.py文件,一种简单的解决方法是找到该文件并直接删除(经测试,删除后对打包后的exe文件无明显影响),待打包完成后再将其放回即可:

打包过程若无异常,会得到几个文件,进入dist文件夹即可看到.exe文件。

至此,我们成功利用Python实现了千图成像工具的制作。

到此这篇关于基于Python实现千图成像工具的示例代码的文章就介绍到这了,更多相关Python千图成像内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。