可以藏小说的小练习

发布于 2020-07-26  10 次阅读


一张图片是由RGB(Red,Green,Blue)(0~255)组成的,而中文文字经过utf-8转码后也是一串数字,那么可以将文字藏在图片里吗?答案是肯定的.以"龙"字为例utf-8编码是/40857(十进制)/0x9f99(十六进制)/100111111 0011001(二进制)/如果把前八位100111111作为G(Green)储存,后八位0011001作为B(Blue)储存就可以得到一个像素,以此文章的每个字都可以当成一个像素,很有意思,对于python的学习也很有帮助(藏小说神器)

print(ord('龙'))
# 结果为40857

1.环境要求

本机带有python 3.7.X的编程环境

2.准备工作

在cmd输入下面代码安装pillow以导入PIL模块

pip install pillow

3.转换为图片代码

from PIL import Image
import math

def encode(story):#定义函数
    width=math.ceil(len(story)**0.5)#计算字数的开方
    picture=Image.new("RGB",(width,width),0x0)#生成长宽为width的正方形
    x,y=0,0#定义坐标
    for char in story:
        rgb=(0,(ord(char) &0xff00)>>8,ord(char)& 0xff)#设置rgb为(0,汉字前八位,后八位)
        picture.putpixel((x,y),rgb)#设置像素坐标和rgb
        if x== width-1:
            x=0
            y+=1
        else:
            x+=1
    return picture

if __name__=='__main__':
    with open("1.txt",encoding='utf-8') as file:#打开txt文件操作
        txt=file.read()
    picture=encode(txt)#传入make函数
    picture.save("out.bmp")#生成神秘图片

4.图片解码文字代码

from PIL import Image

def decode(picture):#定义转换函数
    width,height=picture.size#传出长和宽
    txt=[]#文章的列表
    for y in range(height):
        for x in range(width):
            R,G,B=picture.getpixel((x,y))#(读取x,y的rgb)
            if(R|G|B)==0:#设置文章终止
                break

本当の声を響かせてよ