每天学习一点新知识(二)——用文字来构成一张图片
因为疫情的原因,明明已经到了武汉樱花开放的季节,却无法前去观赏,于是前些天一位武大学生用Python敲出了一朵樱花的延时开放。于是我就想,我可不可以也尝试着去做一下。
为了循序渐进,本篇博客先对图片进行处理,之后会另写一篇对视频处理的。
那么下面我们就正式开始吧。
准备工作
PyCharm,以及一些相应的库(稍后到代码中会详细介绍)
一张图片
先从图片开始
首先看需要导入一些需要的库
import os
from PIL import Image, ImageFont, ImageDraw
介绍一下这些库:
os库是一个Python内置库,是用来进行对文件、目录的处理,它可以使我们的程序与平台无关,可移植性较好。
PIL库是用来进行图像处理的库,它可以将图片读为类,非常简单方便地对图形进行处理。需要注意的是,安装的命令是pip install pillow
然后是读取图片
#str_out是我们打算将图片用什么文字填满
str_out = '武汉加油'
#imin是获取的我们将要处理的图片,height和width分别为图片的高和宽
imin = Image.open("./图片.jpg","r")
height = imin.height
width = imin.width
#获取字体,填充的文字用什么字体显示,可根据个人喜好改变
#三个变量分别问字体文件,字体大小,字体编码方式
font=ImageFont.truetype("./方正隶书简.TTF", 6, encoding="unic")
#获得字体的宽和高
font_w,font_h=font.getsize(str_out[0])
#设置输出图片的颜色通道、大小及底色
imout = Image.new("RGB",(imin.width,imin.height),'black')
下面开始对图片进行处理
colors = []
k = 0
#按字体大小,逐像素替换为对应颜色的文字
for i in range(0, imin.height, font_h):
color = []
for j in range(0, imin.width, font_w):
pixel = imin.getpixel((j,i))#得到每个像素的坐标
color.append((pixel[0],pixel[1],pixel[2]))#记录像素颜色信息
colors.append(color)#将每个像素的颜色信息存储到colors种
draw = ImageDraw.Draw(imout)#创建Draw对象以对imout进行操作
for i in range(0, imin.height, font_h):
k = 0
for j in range(0, imin.width, font_w):
#逐个将图片中的各像素用文字替代
draw.text([j, i],str_out[k],colors[i // font_h][j // font_w], font)
k += 1
k %= len(str_out)
#输出图片
imout.save("图片.png", encoding='utf-8')
以上就是输出一张由文字构成的图片的全部代码了,是不是很简单呢。相信稍微有点Python基础的人都不难理解。
下面向大家展示一下效果
效果展示
原图片:
输出图片:
怎么样,是不是很不错呢?
图片中文字的内容以及字体样式、大小等大家都可以自行调整哦。