作者: 锋小刀
微信搜索【Python与Excel之交】关注我的公众号查看更多内容

千图成像也就是用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()

界面效果如下:

逻辑设计

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

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%的高宽,用round进行四舍五入取整
Increase_width = round(width * 0.10) * round(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)

生成的图片清晰度还是很高的:

图片合成

把底图和组图进行合并,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与Excel之交】关注我的公众号后回复‘千图成像’获取!

用python实现千图成像工具,快给你的男/女神做一个吧~相关推荐

  1. python 爬取图片_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  2. python千人成像_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  3. python 透明图片合成_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  4. Python---如何实现千图成像:初级篇(从图片爬取到图片合成)

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  5. ps入门第20天_ps批处理_ps动作的编辑与创建 案例:千图成像

    一前言 二操作步骤 1.录制动作 ①窗口---动作---创建文件夹 ②创建新动作---命名 ③点击开始记录 ④点击裁剪---按住shift---裁剪出正方形 ⑤文件---存储为 找个任意的文件夹存放即 ...

  6. python爬千图网高清图片

    代码如下: import urllib.request import re for i in range(1,2):url = "http://www.58pic.com/piccate/7 ...

  7. python千人成像_千图成像,教你用胡歌照片做千人成像照片

    @卡乐筠: 先看效果: 原图,其它小图自己百度图片搜索胡歌找. 此教程用于告白求婚都是极好的,因为我胡歌马上就去美国深造了,短期内看不到他了,不过他也是为了展现更好的自己,所以祝他学成归来,胡椒等你回 ...

  8. 【Python爬虫】爬取英雄联盟所有皮肤图片实现千图成像~

    前文 本文主要分为两个部分 一部分是爬虫,这边是选择爬取英雄联盟官网英雄资料中的英雄皮肤图片,如下为新英雄seraphine的页面,包含英雄对应的所有皮肤: 另一部分是图片的合成,先将所有英雄皮肤图片 ...

  9. 《Python 黑科技》10万粉丝头像千图成像(撩对象)

    点赞 ➕ 评论 ➕ 收藏 = 三连再看你最帅 目录

  10. 100天精通Python丨黑科技篇 —— 23、千图成像,爱心加倍(程序员的浪漫)

    目录

最新文章

  1. Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值
  2. cleanmymac3.9.6 for mac_色轮插件配色神器Coolorus 2.6(win+mac)
  3. binlog关闭事务记录_Mysql 数据库 InnoDB引擎对binlog_format的限制
  4. [How TO]-如何使用Sphinx编写漂亮的文档
  5. leetcode 636. Exclusive Time of Functions | 636. 函数的独占时间(Stack)
  6. 集成spark_全面对比,深度解析 Ignite 与 Spark
  7. 搜索引擎技术之网络爬虫
  8. linux 查看命令帮助,Linux中查看帮助相关的命令整理
  9. 中琛源主要的产品是什么
  10. cent mysql 配置,centos下MySQL安装配置
  11. POS-商户手续费-从生活剖析,通俗易懂
  12. 纸壳cms php,纸壳CMS 3.4 发布,电商功能增强
  13. 【IoT】 产品设计与工艺:塑料表面处理工艺
  14. web前端素材整理汇总
  15. windows 2003 系统中安装 火狐浏览器
  16. 创建一个新用户身份为计算机管理员,以Guest账户身份创建一个管理员
  17. 我的秋招圆满落幕了,很开心
  18. 物联网 PaaS 平台大盘点
  19. cesium接入加载3D城市建筑物(离线)(cesium篇.19)
  20. 读书笔记(第五周)之魔方的创新

热门文章

  1. 广州科二化龙考场_广州市机动车驾驶人化龙考场交通路线攻略
  2. C# 使用 itextsharp
  3. C语言游戏开发闪屏解决办法--双缓冲技术
  4. CIO40知识星球—3年主管升职IT经理(28-30岁)
  5. linux的vmstat命令,vmstat命令参数详解
  6. python绘图苹果_如何使用python代码画一个苹果?
  7. 用html制作带阴影小球弹跳,AE怎么制作一个有影子的弹跳小球动画?
  8. 如何防止editor中出现遮行的现象
  9. ARINC 429总线协议解析
  10. CS224N WINTER 2022(四)机器翻译、注意力机制、subword模型(附Assignment4答案)