脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 基于Python实现千图成像工具的示例代码

基于Python实现千图成像工具的示例代码

2022-07-26 19:36锋小刀 Python

千图成像也就是用N张图片组成一张图片的效果。这篇文章将利用Python语言编写一个简单的千图成像工具,感兴趣的小伙伴可以了解一下

千图成像也就是用N张图片组成一张图片的效果。制作方法有很多的,最常见的如用ps、懒人图云、foto-mosaik-edda这些制作。

千图成像的效果我大致分为两类:一为直接用N张图片根据底图的像素颜色、大小,一张张的组成底图,如foto-mosaik-edda;二为用N张图片根据底图的像素大小,组成一张与底图大小相仿的图片,再把二者合成,经调整透明度而成的图片,如ps。

第一种算是真正意义的千图成像,但如果选的图片不够底图的像素颜色匹配,就会造成生成的图片畸形,但如果选择的图片够好,最终的效果会非常好;第二种的效果就比较平淡了,但对选择的图片没什么要求,生成的图片比较正常。

二者的效果各有千秋,而本文使用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()

界面效果如下:

基于Python实现千图成像工具的示例代码

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。

修改底图大小

对于底图,我们可以称之为‘容器’,底图的大小决定其组成图片的多少,也可以决定组成图片的像素大小、是否清晰。取出底图的高宽越多,图片越大,图片越清晰;取出底图百分之十的大小,这个数值可以增大,但最好不要超过百分之三十。

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)

修改组图大小

把组成图片的大小修改为底图的百分之十的大小,这个数值也可以增大:

# 读取文件路径下的图片,并修改大小
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)

生成的图片清晰度还是很高的,不过在手机上看比较模糊:

基于Python实现千图成像工具的示例代码

组图效果

图片合成

把底图和组图进行合并,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")

基于Python实现千图成像工具的示例代码

图片效果

GUI打包

打包可以直接使用pyinstaller进行安装;如果你不知道怎么打包,或者不熟悉命令行操作,可以使用前面文章:打包工具,这款打包工具可以简单的满足打包需求。

使用pyinstaller库打包,启动命令行窗口,在命令行窗口cd到文件所在的文件目录中,最后用下面命令进行打包:

pyinstaller -F -w 名称.py

打包时可能会报错:

基于Python实现千图成像工具的示例代码

报错示例

报错源于一个hook-sqlalchemy.py文件,一个简单的解决方法是找到它直接回收删除它(最后暂未发现删除它对打包后的exe文件有什么影响),等打包完成后在放回去即可:

打包过程没出现什么状况,会得到几个文件,进入dist文件夹,就可以看见.exe文件了。

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

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

原文地址:https://mp.weixin.qq.com/s/IYpFRXx-fLZmQ9PXciLtoQ

延伸 · 阅读

精彩推荐
  • Pythonpython实现按任意键继续执行程序

    python实现按任意键继续执行程序

    本文给大家分享的是如何使用Python脚本实现按任意键继续执行程序的代码,非常的简单实用,有需要的小伙伴可以参考下...

    mindg16322020-09-15
  • Python使用python爬取B站千万级数据

    使用python爬取B站千万级数据

    B站我想大家都熟悉吧,其实 B 站的爬虫网上一搜一大堆。不过纸上得来终觉浅,绝知此事要躬行,我码故我在。...

    猫咪编程7522021-03-02
  • PythonPython 随机生成中文验证码的实例代码

    Python 随机生成中文验证码的实例代码

    Python 随机生成中文验证码的实例代码,需要的朋友可以参考一下...

    Python教程网3252020-12-20
  • PythonPython基础之语法错误和异常详解

    Python基础之语法错误和异常详解

    Python有两种错误很容易辨认:语法错误和异常.本文就给大家详细介绍一下Python错误和异常,对正在学习python的小伙伴们很有帮助哦,需要的朋友可以参考下...

    思想流浪者10302021-11-04
  • Python这18 个 Python 高效编程小技巧,真香!

    这18 个 Python 高效编程小技巧,真香!

    初识Python语言,觉得python满足了你上学时候对编程语言的所有要求。python语言的高效编程技巧让那些曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终...

    Python学习与数据挖掘11682021-12-27
  • Python11个Python3字典内置方法大全与示例汇总

    11个Python3字典内置方法大全与示例汇总

    这篇文章主要给大家介绍了11个Python3字典内置方法大全与示例的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学...

    若数3962021-06-25
  • PythonPython3实现的判断回文链表算法示例

    Python3实现的判断回文链表算法示例

    这篇文章主要介绍了Python3实现的判断回文链表算法,结合实例形式分析了Python3针对链表是否为回文链表进行判断的相关算法实现技巧,需要的朋友可以参考下...

    zhenghaitian12302021-06-05
  • Pythonpython3+PyQt5实现拖放功能

    python3+PyQt5实现拖放功能

    这篇文章主要为大家详细介绍了python3+PyQt5实现拖放功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    basisworker8862021-02-05