from PIL import Image
import numpy as np
### Image to Char 图片转字符
if __name__ == '__main__':
image_file = 'son.png'
height = 100 # 规定转化出来的‘字符图片’的高度为100
# PIL.Image包;PIL图像处理基础包,OPENCV图像处理强化包
img = Image.open(image_file)
img_width, img_height = img.size # 图像的宽度和高度(对应一般意义上的长和宽)
print(img_width, img_height)
width = int(2 * height * img_width // img_height) # 字符图片宽度,取整
img = img.resize((width, height), Image.ANTIALIAS) # 自定义字符图片的宽度和高度,Image.ANTIALIAS抗锯齿
# pixels 像素点
# PIL-convert()函数
pixels = np.array(img.convert('L')) # 将彩色图片转化成灰度图
# L为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
# 在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:
# L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000
print(pixels.shape) # 得到的*矩阵*形状为(height, width)
print(pixels)
chars = "MNHQ$OC?7>!:-;. " # 最后一个是空格;按照自己的感官,从最黑到最白排序,共16个
N = len(chars)
step = 256 // N # 0~255种灰度,256//16=16,第0~15用M显示,第16~31用N表示·····
result = '' # 字符图片其实就是一个非常庞大的字符串
for i in range(height): # 行
for j in range(width): # 列
result += chars[pixels[i][j] // step]
result += '\n' # 每处理完一行要进行换行操作
with open('text.txt', mode='w') as f: # 使用with不需要f.close()
f.write(result) # 将字符图片写入到text.txt中显示)