动态照片墙 python 实现_利用python生成照片墙的示例代码
这篇文章主要介绍了利用python生成照片墙的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。
PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。本文只使用了PIL那些最常用的特性与用法,主要参考自:http://www.effbot.org/imagingbook。
Part 1:利用python生成照片墙
(1)简要介绍思路:
(1)通过给定字符串生成一张图片;
(2)然后将该图片的每个像素的宽扩张edge_len倍,高也扩张edge_len倍,假设edge_len=60,那么原文字图片的每个像素就变成了60*60像素的一个图片;
(3)原文字图片的每个像素的透明度不同,显示文字的地方,透明度低(不透明),这2个字周边的地方,透明度高(透明),我们根据原文字图片每个像素的透明度,来设定放到这个像素(其实宽高已经扩大了60倍)图片的透明度(trans_alpha方法实现)。
(2)导入库文件
1
2
from PILimport Image, ImageDraw, ImageFont
import os
(3)由文字生成图像
1
2
3
4
5
6
7
8
9
10
def gen_text_img(text, font_size=20, font_path=None):
# args:文字内容,文字字体大小,字体路径
font= ImageFont.truetype(font_path, font_size)if font_pathis not None else None
(width, length)= font.getsize(text)# 获取文字大小
text_img= Image.new('RGBA', (width, length))
draw= ImageDraw.Draw(text_img)
# 第一个tuple表示未知(left,up),之后是文字,然后颜色,最后设置字体
draw.text((0,0), text, fill=(0,0,0), font=font)
text_img.save('./temp_pic.jpg')
return text_img
(4)透明度调节
1
2
3
4
5
6
7
8
9
def trans_alpha(img, pixel):
'''
根据rgba的pixel调节img的透明度
这里传进来的pixel是一个四元组(r,g,b,alpha)
'''
_, _, _, alpha= img.split()
alpha= alpha.point(lambda i: pixel[-1]*10)
img.putalpha(alpha)#Part2有介绍
return img
(5)根据透明度参数对放大文字图进行像素覆盖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def picture_wall_mask(text_img, edge_len, pic_dir="./user"):
# 根据文字图gen_text_img像生成对应的照片墙,输入:文字图像,各个照片边长,照片所在路径
new_img= Image.new('RGBA', (text_img.size[0]* edge_len, text_img.size[1]* edge_len))
file_list= os.listdir(pic_dir)
img_index= 0
for xin range(0, text_img.size[0]):
for yin range(0, text_img.size[1]):
pixel= text_img.getpixel((x, y))#Part2有介绍
file_name= file_list[img_index% len(file_list)]
try:
img= Image.open(os.path.join(pic_dir, file_name)).convert('RGBA')#Part2有介绍
img= img.resize((edge_len, edge_len))
img= trans_alpha(img, pixel)
new_img.paste(img, (x* edge_len, y* edge_len))#指定区域替换,Part2有介绍
img_index+= 1
except Exception as e:
print(f"open file {file_name} failed! {e}")
return new_img
(6)生成照片墙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def main(text='', font_size = 20, edge_len = 60,pic_dir = "./user", out_dir = "./out/",
font_path = './demo.ttf'):
'''
生成照片墙
:param text: Text of picture wall, if not defined this will generage a rectangle
picture wall
:param font_size: font size of a clear value
:param edge_len: sub picture's egde length
'''
if len(text) >= 1:
text_= ' '.join(text)#将字符串用空格分隔开,提高展示效果
#text_ = text
print(f"generate text wall for '{text_}' with picture path:{pic_dir}")
text_img= gen_text_img(text_, font_size, font_path)
# text_img.show()
img_ascii= picture_wall_mask(text_img, edge_len, pic_dir)
# img_ascii.show()
img_ascii.save(out_dir+ os.path.sep+ '_'.join(text)+ '.jpg')
(7)函数执行与传参
1
2
if __name__== '__main__':
main(text='python')
文件目录结构如下,以供参考:out存放生成的照片墙,user存放贴上去的图片。
完整代码参考:git链接
(8)样图
Part 2:图像处理过程中中学习到的几个知识点:
(1)python PNG图片显示导入库文件
仅适用于显示png格式的图片
1
2
import matplotlib.pyplot as plt# plt 用于显示图片
import matplotlib.image as mpimg# mpimg 用于读取图片
显示图片
1
2
3
4
5
6
lena= mpimg.imread('temp_pic.png')# 读取和代码处于同一目录下的 lena.png
# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape#(512, 512, 3)
plt.imshow(lena)# 显示图片
plt.axis('off')# 不显示坐标轴
plt.show()
(2)PIL中图像格式转换img.convert()函数
在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。
对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。对于PNG、BMP和JPG彩色图像格式之间的互相转换都可以通过Image模块的open()和save()函数来完成。具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。处理完毕,使用函数save(),可以将处理结果保存成PNG、BMP和JPG中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。
而对于Part 1中convert()函数的使用,推荐一篇博文Python图像处理库PIL中图像格式转换以供参考学习。
(3)img.paste()函数
第一个参数是用来覆盖的图片,第二个参数是覆盖的位置,参考博文。
(4)img.getpixel()函数
查看图像存储值,参考博文。
(5)python图像处理:给图像添加透明度(alpha通道)
主要介绍img.putalpha()函数的用法,参考博文
到此这篇关于利用python生成照片墙的示例代码的文章就介绍到这了
动态照片墙 python 实现_利用python生成照片墙的示例代码相关推荐
- 利用python发送邮件_利用python实现简单的邮件发送客户端示例
脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...
- java调python 监控_利用Python实现一个简单的系统监控图表
作为运维人员,想必大家肯定都做过这样的事情:为了监控系统资源使用情况,开了若干个窗口,来回切换看输出: 只要我切得够快,性能异常点就逃不过我的眼睛! 这个时候你要是有个监控工具自然是很好的,例如我们美 ...
- excel python插件_利用 Python 插件 xlwings 读写 Excel
Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...
- ppt python 图表_利用python分析weibo数据做成图表放入PPT中
起因 很久以前,就有个想法,就是自动分析微博的数据,但是之前一直想的是网页版展示,flask想学了好久都没学,偶然的一次看到了一篇关于python处理pptx的文章,再加上同窗三年的室友在毕业后竟然主 ...
- 如何用python赚钱_利用python能怎么挣钱
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 6年python,期间写了各种奇葩爬虫,挣各种奇葩的钱,写这篇文章总结下几种爬虫 ...
- python推荐_利用Python构建一个简单的推荐系统
原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...
- autocad支持python吗_利用python控制Autocad:pyautocad方式
发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...
- python拼图_利用python制作拼图小游戏的全过程
开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装P ...
- python 认证机构_利用Python爬了SIG官网BQB认证公司清单,我有一些重大发现..
关注"无线技术联盟"提供有价值的物联网市场信息和最新的技术分析 利用Python爬取了蓝牙联盟上近一年BQB认证公司的清单,把爬到的有价值的东西写出来分享给大家. 1 蓝牙认证 产 ...
最新文章
- saltstack pkg模块用法
- getComputedStyle currentStyle 获取当前元素所有最终使用的CSS属性值
- 搭建前端私有npm杂记
- .NET 数据访问架构指南(转)
- 一分钟理清Mysql的锁类型——《深究Mysql锁》
- PID算法搞不懂?看这篇文章就够了。
- 在iview的Table中添加Select(render)
- php order by where,无合适where条件过滤时尽量选择order by后的字段以驱动表进行查询...
- 报错--Problem executing scripts APT::Update
- 电子/硬件工程师手册
- cdrx7拼版工具在哪里_CorelDRAW X7标签怎么排版?
- 图片放大后很模糊怎么办?
- win10访问不了win7文件服务器,win10和win7共享文件教程 win10和win7共享文件无法访问...
- openstack项目进展
- Pytorch forward方法调用原理
- URL中带特殊字符的处理方式
- 知物由学 | 行为时序建模在社交引流黑产识别中的应用
- 还在吐槽翻译的外版书质量差吗?谈谈我个人的理解
- 电脑上怎么压缩PDF文件
- python奇数阶乘求和_Python阶乘求和的方法
热门文章
- 【C语言】请输入一个n(n=10)并输出一个n行n列的杨辉三角
- vba 判断控件有无_6小时,写了一篇适合Excel小白学的VBA入门教程
- springboot 404_Spring Boot(四) 异常处理
- python爬虫进阶教程:百万英雄答题辅助系统
- Python——单元测试
- json字符串,JSON对象,JSON数组的区别与相互转换
- Python os模块文件操作(一)
- python:浅析python 中__name__ = '__main__' 的作用
- C# LDAP认证登录类参考
- Visual Studio 2008下AJAX的设置