【python】只要简单应用PIL库里的Image模块,就轻轻松松实现了抖音上很火的字符画,赶紧进来学习一下!

前言

最近抖音上挺火的一个小把戏,在记事本打开,一整篇的乱码字符,然后进过调整之后,出现一张由各种字符组成的黑白照片。感觉挺有意思的,今天就来看看这是怎么实现的。

什么是字符画

字符画,一种由字母、标点、汉字或其他字符组成的图画。就像下面的这样的图片,大家放大看都是由英文字符拼装起来的。

原图

效果图

左上角局部图

效果图是不是感觉挺有意思的,其实实现很简单。我是通过python,几十行代码就能实现,前提是你熟悉python代码。如果不熟悉没关系,可以看我们往期精彩的python教程:


入门Python,这一篇就够了。小白必看,文末有福利!

思路

运用python图像处理PIL中的Image模块来处理图像

运行环境

1、需要安装python

2、PIL库(在cmd中运行安装命令:pip install Pillow)

简单介绍Image模块

Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。下面简单介绍下代码中用到的类。

open函数

Image.open(file) ⇒ image 
Image.open(file, mode) ⇒ image

要从文件加载图像,使用 open() 函数。如果变量mode被设置,那必须是“r”。用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。
例:

from PIL import Image             ##调用库
im = Image.open("D:\test\test.jpg")  ##文件存在的路径
im.show() 

Resize函数

im.resize(size) ⇒ image 
im.resize(size, filter) ⇒ image

返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。

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)

第三步:处理图片

#将彩色图片的RBG数值转化为灰度值,并根据字符的个数计算出每个字符对应几个灰度值
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)

这样就完成了。

结束语

是不是很简单,大家也赶紧动手制作一张自己的字符图吧。由于篇幅和不方便阅读的原因,这里就不展示源码了。

如果你想体验下和需要源码的同学,请关注我们的微信公众号回复“字符图”获取源码吧。

 

也欢迎大家关注我们的公众号,来跟小编一起交流分享你制作的字符图。欢迎大家踊跃留言。

å¨è¿éæå¥å¾çæè¿°

- END -

参考1:https://blog.csdn.net/zhangziju/article/details/79123275
参考2:https://blog.csdn.net/dpengwang/article/details/79076188
侵删,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值