一霎好风生翠幕,几回疏雨滴圆荷。——(宋)晏殊《浣溪沙》
时间过得好快,转眼就到了夏天,又到了骄阳似火的季节。最近忙里偷闲,做了一个新鲜玩意儿,用Python编程把图片转成了文字图,以后发朋友圈配图可以变得高级一些。没什么好说的,直接上代码。
# -*- coding:utf-8 -*-
from PIL import Image, ImageDraw, ImageFont
def pic2Text(_file, _text):
img = Image.open(_file).convert("RGBA")
w = 100 # 宽度固定
h = int((float(img.size[1]) / float(img.size[0])) * w) # 高度按比例得出
fontSize = 20 # 输出字体大小
img.thumbnail((w, h)) # 获取缩略图
src = img.convert('L') # 转换成灰度图
minGrey = 255 # 最小灰度
maxGrey = 0 # 最大灰度
greyMap = [[0 for col in range(h)] for row in range(w)] # 灰度图 注意 w h
# 此处循环求得灰度表以及最大最小灰度值
for i in range(w):
for j in range(h):
greyMap[i][j] = src.getpixel((i, j)) # 获取每一个点的灰度值
if greyMap[i][j] > maxGrey: # 获取最大灰度
maxGrey = greyMap[i][j]
if greyMap[i][j] < minGrey: # 获取最小灰度
minGrey = greyMap[i][j]
# 计算灰度间隔
greyStep = (maxGrey - minGrey) / len(_text)
# 此处生成文字图片,注意输出的时候 w 和 h
output = Image.new('RGBA', (w * fontSize, h * fontSize), (255, 255, 255))
draw = ImageDraw.Draw(output)
ft = ImageFont.truetype("msyhbd.ttc", fontSize) # 注意字体支持中文
for j in range(h):
for i in range(w):
index = int((greyMap[i][j] - minGrey) // greyStep) # 计算出改点使用哪个字符
if index >= len(_text):
index = len(_text) - 1 # 注意结尾最大灰度值,防止越界
draw.text((i * fontSize, j * fontSize), unicode=(_text[index], 'UTF-8'), fill=img.getpixel((i, j)), font=ft,
text=_text[index]) # 汉字编码
output.save(_file.split('.')[0] + '_text.png', 'PNG')
if __name__ == '__main__':
textList = ['猛', '龙', '过', '江']
pic2Text('E:/001.jpg', textList)
如果出现错误:OSError: cannot open resource,是由于字体没有安装,安装msyhbd.ttc字体即可。最后来一张云龙兄的效果图:
这个东西还是有那么点意思的,以后碰到不太懂的可以用来吹吹逼,O(∩_∩)O哈哈~,就分享到这里吧!
参考:
1、https://github.com/winterfeel/Pic2Text/blob/master/pic2Text.py