python将图片表情包转化成字符

原理:

  • 将简单的表情图取灰度图像二值化,然后不同值用不同的字符串代替该像素即可
  • 扩展一下,可自行定义一个数值(最好为2的指数幂,2,4,8,16等),将256个灰度值等分成几个范围,以4为例,先自行定义四个字符0-63为第一块,64-127为第二块,然后扫描灰度图,按灰度值确定属于四个范围的哪一块,然后用相应的字符替换该像素即可
  • 显而易见的是:当我们取值越大,给出的字符越多时,越能体现图像的细节,但是鉴于字符的文本显示非常依赖于编辑器,所以效果可能不是很好。

一些总结

举例字符数组的排列比较有讲究,换一个顺序,图片的展示效果完全不一样,这个大家可以自行测试。

以我个人的使用经验来看,字符之间的渐变应该比较小,但是两端的区别较大,这样的设置显示效果理论上应该比较好,举例:mn这两个字符相邻比较合适,空格和$@#之类的字符应该隔得比较远,简单来说整个样例字符的分布理想状态应该类似于一条由明到暗的渐变带一样

from PIL import Image

chars = list("A-% ,+1n&M-B/\?<8&WM#$_+~*|(){}[]>i!lI;:,\"^`'. ")

# 图像整体使用多少个字符来表示? 必须为2的指数倍2,4,6,8,16,32最大
# 对于只想看轮廓的图,2或4显示效果较好,对稍微追求细节的图稍微弄大一点
num = 4;
chars = chars[:num]
# isThumb = True
isThumb = False
width,height =80,40

#分节因子
factor = int(256 / len(chars))

# 依据灰度值阶梯返回不同的字符
def get_char(pix):
    for i in range(0,len(chars)):
        if pix < factor * (i+1):
            return chars[i]


img = Image.open('flower.jpg')

if img.mode=='P' or img.mode =='RGBA':
     im=Image.new('RGB',img.size,'white')
     im.paste(img.convert('RGBA'),img.convert('RGBA'))
     img= im
# 转化为灰度图
img = img.convert("L")
w,h = 0,0
# 进行图片大小的变换
if isThumb:
    w,h = width,height
    img=img.resize((w,h),Image.NEAREST)   #NEAREST低质量图
else:
    w,h = img.size
    img = img.resize((w,int(h/2)),Image.NEAREST)
    h= int(h/2)


data=[]
pix = img.load()
length = len(chars)
data = ""
#扫描整个图片,按灰度置换图片
for i in range(0,h):
    line = ""
    for j in range(0,w):
        line += get_char(pix[j,i])
    data += line+"\n"

with open("a.txt",'w') as f:
    f.write(data)

 

 

 

知识点记录:

一、图片的打开与显示

from PIL import Image

img=Image.open('d:/dog.png')

img.show()

另一种方式

from PIL import Image

import matplotlib.pyplot as plt

img=Image.open('d:dog.png')

plt.figure("dog")#图片的名称

plt.imshow(img)

plt.show()

打开图片后,可以使用一些属性来查看图片信息

print(img.size)#图片的尺寸
print(img.mode)#图片的模式
print(img.format)#图片的格式

二、图片的保存

img.save('d:/dog.jpg')

就只需要一行代码,不仅能保存图片,还可以转换格式

三、读取图像并将其转换成灰度图像

img=Image.open('d:/dog.jpg').convert('L')
坐标轴不显示的操作:

from  pylab import *

axis('off')

四、显示轮廓图像和直方图

from PIL import Image
from pylab import *
 
# 读取图像到数组中
im = array(Image.open('time.jpg').convert('L'))
 
# 新建一个图像
figure()
# 不使用颜色信息
gray()
# 在原点的左上角显示轮廓图像
contour(im, origin='image')
axis('equal')
axis('off')


figure()
hist(im.flatten(),128)
show()

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值