Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用python实现千图成像工具,快给你的男/女神弄一张吧~

用python实现千图成像工具,快给你的男/女神弄一张吧~

作者头像
Python与Excel之交
发布于 2021-10-26 07:06:34
发布于 2021-10-26 07:06:34
1.1K00
代码可运行
举报
文章被收录于专栏:Python与Excel之交Python与Excel之交
运行总次数:0
代码可运行

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

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

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

二者的效果各有千秋,而本文使用python实现的是第二种方法,最后制成GUI。

前置

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import PySimpleGUI as sg
from PIL import Image
import os
import numpy as np
import random

相关库使用pip命令安装即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install 库名

GUI制作

为了以后方便使用,不用一次次跑程序,而在原有的程序基础上进行GUI制作,最后打包成.exe可执行文件。

GUI界面设计

对于GUI界面的功能只需要设定五个功能即可:

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

最终设计代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 主题设置
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界面效果

逻辑设计

获取图片时,因为可以输入路径,可能会造成保存,所以这里加个判断;最后把得到的图片路径存入列表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if event == 'image_file':
    files = values['image_file']
    if os.path.exists(files):
        img_Main_file.append(files)
    else:
        print('图片不存在,请重新选择图片!')
        # 弹窗
        sg.popup('图片不存在,请重新选择图片!')

获取组图所在的文件夹路径,依然把得到的路径存入列表中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if event == '选择组图':
    files = sg.popup_get_folder('请选择选择组图路径:')
    if os.path.exists(files):
        img_secondary_file.append(files)
    else:
        print('文件不存在,请重新选择文件')
        sg.popup('文件不存在,请重新选择文件')

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

修改底图大小

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

修改组图大小

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 读取文件路径下的图片,并修改大小
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)

计算图片填充次数

上面说过,底图的大小决定了组成图片的多少,而下面的代码就是根据底图的大小以及组成图片的大小计算出主图能填充多少图片:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 计算主图高宽能填充多少图片
width_picture_Fill_frequency = int(Increase_width / int(width * 0.10))
height_picture_Fill_frequency = int(Increase_height / int(height * 0.10))

组图合成

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img = Image.blend(array_img, open_img, alpha=0.8)  # 0.7,0.8,0.9
img.save('千图成像.jpg')

图片效果

GUI打包

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pyinstaller -F -w 名称.py

打包时可能会报错:

报错示例

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

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

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

本文使用的图片、代码以及生成的小工具,可以关注”Python与Excel之交“,在后台回复“千图成像”即可获取,自己操作一遍会有更好更好的效果哦!

以上便是今天的全部内容了,原创不易,欢迎点赞、分享,支持我继续写下去!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与Excel之交 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用python实现清理重复文件工具~
在电脑上或多或少的存在一些重复文件,体积小的倒没什么,如果体积大的就很占内存了,而如果自己一个一个查看文件是否重复,然后再删除,还是很要命的。
Python与Excel之交
2021/11/09
2K0
用python实现清理重复文件工具~
用Python制作一个随机抽奖小工具
最近在工作中面向社群玩家组织了一场活动,需要进行随机抽奖,参考之前小明大佬的案例,再结合自己的需求,做了一个简单的随机抽奖小工具。
可以叫我才哥
2021/08/05
2.1K0
用python实现批量打包程序的工具~
最近看了一些大佬发的关于可视化打包工具auto-py-to-exe文章,auto-py-to-exe是基于pyinstaller,但相比于pyinstaller,它多了 GUI 界面。我自己也试了一下,感觉确实好用且方便,动动手指就能对程序进行打包。
Python与Excel之交
2021/10/14
1.3K0
用Python手撕一个批量填充数据到excel表格的工具,解放双手!
今天这篇文章是根据批量填充数据的进阶版。基础版本就一段很简单的代码。虽然简单,但如果这个模板或者数据发生变化,还是要改来改去的,所以本文就在基础版本上进行改进,只需要动动鼠标就可以填充大量数据到Excel工作表中。
Python与Excel之交
2021/08/05
2.2K0
手把手教你爬取某酷音乐付费歌曲~
爬取酷我音乐相比网易云音乐、酷狗音乐以及QQ音乐来说容易很多,没有加密算法,而且在反爬虫中不存在一些难理解的逻辑,只需要理清思路即可!本文会用爬虫+GUI制作酷我音乐下载工具
Python与Excel之交
2021/08/05
3.6K0
140行代码自己动手写一个词云制作小工具(文末附工具下载)
继之前出过表格拆分与合并小工具、pdf转word小工具后,今天我们迎来了词云制作小工具。
可以叫我才哥
2021/08/05
1.1K0
爱了爱了,扔了网上的正则调试工具后,我吧啦吧啦自己写了一个!(文末附源码以及工具下载)
最近在做个项目,里面经常用到正则表达式,需要不停的调试修改正则表达式,如果直接在程序里跑,是一件很麻烦且缓慢的事,网上有挺多的正则表达式调试网站,奈何这边网络太差,比让人在程序里跑还让人崩溃,所以就自己写了个正则表达式调试小工具。
Python与Excel之交
2021/09/06
5850
GUI实战|Python做一个文档图片提取软件
本文将进一步讲解如何用Python提取PDF与Word中图片,并结合之前讲解过的GUI框架PysimpleGUI,做一个多文件图片提取软件,效果如下:
刘早起
2021/01/05
1.6K0
80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)
可能是最近加班熬夜太多,这个周末身体不舒服,头痛、冷汗什么的。终于在连着睡了接近2天后,现在慢慢恢复了。
可以叫我才哥
2021/08/05
1.4K0
老板又出难题,气得我写了个自动化软件
日常工作中,领导要求你将一份 Word 文档中的图片存储到一个文件夹内,你可能会一边内心崩溃,一边开始一张张的 另存为。
朱小五
2021/01/20
7130
惊呆同事的自动化小工具来了!Python 批量将 PDF 转 Word
本期视频内容:惊呆同事的自动化小工具来了!Python 批量将 PDF 转 Word
杰哥的IT之旅
2022/12/06
1.8K0
惊呆同事的自动化小工具来了!Python 批量将 PDF 转 Word
用Python制作一个B站视频下载小工具
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
查理不是猹
2022/01/11
1.1K1
用Python敲一个今日历史查看小工具,让它来告诉你历史的今天发生过什么大事!
这篇文章灵感源于最近发生的事,信息量都很大,然后突然就想看看历史的今天有发生过什么大事件,最后就写了个查看今日历史的小工具,下面就开始实战!
Python与Excel之交
2021/08/05
8701
40行代码自己动手写pdf转word小工具(文末附工具下载)
今天咱们介绍一个pdf转word的免费小工具,满足这么一个不常见但是偶尔会出来烦人的需求!
可以叫我才哥
2021/08/05
2.6K0
用Python制作一个B站视频下载小工具(文末附完整代码)
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
可以叫我才哥
2022/04/12
4.3K1
用Python制作一个B站视频下载小工具(文末附完整代码)
如何只用一行Python代码制作一个GUI(图形界面)?
GUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。
小F
2022/05/26
1.9K0
如何只用一行Python代码制作一个GUI(图形界面)?
二维码生成器工具开发
本文将使用 Python 的tkinter库和qrcode库创建一个简单的二维码生成器应用。这个应用允许用户输入文本或链接,然后生成相应的二维码,并可以设置二维码的颜色和保存路径。
M.Talen
2024/10/13
4910
二维码生成器工具开发
用Python搞定抖X无水印短视频下载
有时候刷抖音,遇到喜欢的视频保存在本地,然后都是带有水印的,作为有一点“洁癖”的小编,不太喜欢。索性就自己用Python制作了这个简单的小工具,用于下载抖音无水印短视频!
可以叫我才哥
2022/04/12
1K0
用Python搞定抖X无水印短视频下载
Get了!用Python制作数据预测集成工具 | 附代码
经过算法比较,发现这里我们选择使用sklearn简单的多元回归进行拟合数据可以达到比较好的效果。
AI科技大本营
2020/08/24
1.6K0
Get了!用Python制作数据预测集成工具 | 附代码
[1212]Python GUI之PySimpleGUI
最后一个执行后程序会在2s左右自动退出,除了以上的简单的默认函数外,还可以手动设置参数;
周小董
2023/10/10
1.2K0
[1212]Python GUI之PySimpleGUI
推荐阅读
相关推荐
用python实现清理重复文件工具~
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验