喔今天是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)





目前效果极其不理想……

原图

图片1



成品(font-size = 7)

PictureSecretTest

也许是喜欢两个字太难写,也许是爱实在说不出口……



这个丑陋的图片……我尝试着把font-size分别改成3

3号

和5

5号

显然越来越糟




我一度以为换成简单的英文字母会好一点

英文




这些问题留到情人节解决吧,好在我是一条狗,不着急把成品做出来。