最近抖音上挺火的一个小把戏,在记事本打开,一整篇的乱码字符,然后经过调整之后,出现一张由各种字符组成的黑白照片。感觉挺有意思的,今天就来看看这是怎么实现的。什么是字符画字符画,一种由字母、标点、汉字或其他字符组成的图画。就像下面的这样的图片,大家放大看都是由英文字符拼装起来的。
原图
效果图
脸部局部图
效果图是不是感觉挺有意思的,其实实现很简单。我是通过Python,几十行代码就能实现,前提是你熟悉Python代码。
思路运用Python图像处理PIL中的Image模块来处理图像
运行环境1、windows 系统
2、需要安装Python
3、PIL库(在cmd中运行安装命令:pip install Pillow)
简单介绍Image模块
Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。下面简单介绍下代码中用到的类。open函数
Image.open(file) ⇒ image要从文件加载图像,使用 open() 函数。如果变量mode被设置,那必须是“r”。用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。
Image.open(file, mode) ⇒ image
例:
from PIL import Image ##调用库
im = Image.open("D:\test\test.jpg") ##文件存在的路径
im.show()
resize函数
im.resize(size) ⇒ image返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。
im.resize(size, filter) ⇒ image
from PIL import Image
im = Image.open("D:\test\test.jpg")
region = im.resize((400, 400)) ##重新设定大小
region.show()
getpixel函数
im.getpixel(xy) ⇒ value or tuple返回给定位置的像素值。如果图像为多通道,则返回一个元组。该方法执行比较慢;如果用户需要使用Python处理图像中较大部分数据,可以使用像素访问对象(见load),或者方法getdata()。
from PIL import Image
im = Image.open("D:\test\test.jpg")
print(im.getpixel((0,0)))
print(im.getpixel((4,0)))
r,g,b = im.split()
print(b.getpixel((11,8)))
实现流程第一步:打开图片
img = Image.open(imgname)
第二步:对图片重新设置大小
#第二个参数可以设置图片的质量,有四个选项NEAREST,BILINEAR,BICUBIC,LANCZOS
#默认为NEAREST,LANCZOS图像质量最高
img = img.resize((width,height),Image.LANCZOS)
第三步:处理图片
#将彩色图片的RGB数值转化为灰度值,并根据字符的个数计算出每个字符对应几个灰度值
def get_char(r,g,b,alpha= 256):
length = len(ascii_char)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unitcount = (256.0+1)/length
return ascii_char[int(gray/unitcount)]
for i in range(height):
for j in range(width):
#img.getpixel(j,i)返回的是一个三元组元素,加*是为了将其分为三个变量值
txt += get_char(*img.getpixel((j,i)))
txt += '\n'
第四步:
with open(output,'w') as f:
f.write(txt)
这样就完成了。
结束语是不是很简单,大家也赶紧动手制作一张自己的字符图吧。给自己换个与众不同头像,这样的。