喔今天是2.13啦,猜猜看明天是什么特殊的日子。
得了吧,我的标题已经给你答案了,看看我们能做点什么有趣的事情。
简短的Python代码完成图片隐写
首先,来讲讲原理。
事实上,每一张图片都是由一个一个的像素点所组成的。而每个像素点,都有自己的颜色,其颜色可以用一个数组来表示:(a,b,c),其中每位数的取值范围都是 0-255。
比如(0,0,0)代表白色,(255,255,255)代表黑色。当像素点足够多的时候,这张照片就是我们所说的高清照片。而如果当像素点太少,我们的肉眼就能感知到明显的锯齿感。
我只要每个像素取出一个像素值,并使用这个像素做为该字的颜色即可,在像素量够多的情况下,从远处看,是能看到我们原来图像的轮廓的。
有了思路,就可以开始我们的代码。
——摘自 微信公众号Python编程时光
from PIL import Image, ImageDraw, ImageFont
font_size = 7
text = "I love you!"
img_path = "F://ggy.jpeg"
img_raw = Image.open(img_path)
img_array = img_raw.load()
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
ch_gen = character_generator(text)
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
img_new.convert('RGB').save("F://save.jpeg")
我遇到的问题
\ 路径与转义字符
第一次报错
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape
在这里找到了答案
路径中的\符号被识别成了转义字符,无法找到正确的路径。
在字符串前加 r 即可声明字符串不用转义。如:
path = r"C:\Windows\user\fonts\msyh_boot.ttf"
或用Linux的路径格式
path = "C:/Windows/user/fonts/msyh_boot.ttf"
PIL模块中的ImageDraw使用
第二次报错
TypeError: ‘module’ object is not callable
原代码
draw = ImageDraw(img_new)
ImageDraw的使用错误了。抄代码哪哪儿都爽,就是人家打错了我只能抓瞎。花了好长时间才找到这个问题。
修改:
draw = ImageDraw.Draw(img_new)
目前效果极其不理想……
原图
成品(font-size = 7)
也许是喜欢两个字太难写,也许是爱实在说不出口……
这个丑陋的图片……我尝试着把font-size分别改成3
和5
显然越来越糟
我一度以为换成简单的英文字母会好一点
这些问题留到情人节解决吧,好在我是一条狗,不着急把成品做出来。