图片隐写术:将小说存进图片中

将小说存进图片中

思路来自B站up主:偶尔有点小迷糊
视频链接: 点击前往bilibili
按照up主的思路自己pan逻辑,手敲代码,一些处理可能不够简略
代码如下:

from PIL import Image

a = input("1.小说生成图片\n2.图片还原小说\n3.输出结果比较测试\n输入命令序号:")
if a == '1':
    f = open("斗罗大陆.txt","r")
    txt = f.read()
    # 动态分配图片大小
    box = int(len(txt) ** 0.5) + 1
    img = Image.new("RGBA",(box,box),(255,255,255))
    # x为横轴,y为纵轴
    x = 0
    y = 0
    print("生成图片中 Loading...")
    for t in txt:
        t = str(hex(ord(t)))
        l = len(t) - 2
        list = ["0"]*4
        i = 0
        while i < l:
            list[i+4-l] = t[i+2] # 顺序赋值
            i += 1
        if x == box:
            x = 0
            y += 1
        # 写某个像素位置的值
        img.putpixel((x,y),(255,int(list[0]+list[1],base=16),int(list[2]+list[3],base=16)))
        x += 1
    img.save("小说.png","png")
    f.close()
    print("\n处理完成,输出:小说.png")
elif a == '2':
    im=Image.open("小说.png")
    w, h = im.size
    txt = ""
    # x为横轴,y为纵轴
    y = 0
    print("图片处理中 Loading...")
    while y < h:
        x = 0
        while x < w:
            rgb = im.getpixel((x,y))
            t1 = rgb[1]
            t2 = rgb[2]
            t = t1 * 256 + t2 # 顺序赋值,直接计算
            txt += chr(t)
            x += 1
        y += 1
    f = open("小说.txt","w",encoding="utf-8")
    f.write(txt)
    f.close()
    print("\n处理完成,输出:小说.txt")
elif a == '3':
    f1 = open("斗罗大陆.txt","r")
    f2 = open("小说.txt","r",encoding="utf-8")
    t1 = f1.read()
    t2 = f2.read()
    l1 = len(t1)
    l2 = len(t2)
    i = 0
    a = 0
    print("文本比较中 Loading...")
    while i < l1 and i < l2:
        if t1[i] != t2[i]:
            a += 1
        i += 1
    print("\n字符不同个数为 %d\n文本长度差为 %d"%(a,abs(l1-l2)))

(图片超过上传大小限制了,难受,不然我就发出来了
处理完比较时发现字符都相同,但文本长度有384的差值
个人感觉是txt编码格式问题,我再查查

妈妈再也不用担心我存不了XXX 了,手动滑稽
更新:
上面的问题已经找到,后面自动填充的像素被写进去了
解决方法:加入if判断,退出循环即可
更正代码(双像素)

from PIL import Image

a = input("1.小说生成图片\n2.图片还原小说\n3.输出结果比较测试\n输入命令序号:")
if a == '1':
    f = open("斗罗大陆.txt","r")
    txt = f.read()
    # 动态分配图片大小
    box = int(len(txt) ** 0.5) + 1
    img = Image.new("RGBA",(box,box),(255,255,255))
    # x为横轴,y为纵轴
    x = 0
    y = 0
    print("生成图片中 Loading...")
    for t in txt:
        t = str(hex(ord(t)))
        l = len(t) - 2
        list = ["0"]*4
        i = 0
        while i < l:
            list[i+4-l] = t[i+2] # 顺序赋值
            i += 1
        if x == box:
            x = 0
            y += 1
        # 写某个像素位置的值
        img.putpixel((x,y),(255,int(list[0]+list[1],base=16),int(list[2]+list[3],base=16)))
        x += 1
    img.save("小说.png","png")
    f.close()
    print("\n处理完成,输出:小说.png")
elif a == '2':
    im=Image.open("小说.png")
    w, h = im.size
    txt = ""
    # x为横轴,y为纵轴
    y = 0
    print("图片处理中 Loading...")
    while y < h:
        x = 0
        while x < w:
            rgb = im.getpixel((x,y))
            t1 = rgb[1]
            t2 = rgb[2]
            t = t1 * 256 + t2 # 顺序赋值,直接计算
            # 文字部分已结束 即 t = 255*256+255
            if t == 65535:
                break
            txt += chr(t)
            x += 1
        # 再次判断,跳出大循环
        if t == 65535:
            break
        y += 1
    f = open("小说.txt","w",encoding="utf-8")
    f.write(txt)
    f.close()
    print("\n处理完成,输出:小说.txt")
elif a == '3':
    f1 = open("斗罗大陆.txt","r")
    f2 = open("小说.txt","r",encoding="utf-8")
    t1 = f1.read()
    t2 = f2.read()
    l1 = len(t1)
    l2 = len(t2)
    i = 0
    a = 0
    print("文本比较中 Loading...")
    while i < l1 and i < l2:
        if t1[i] != t2[i]:
            a += 1
        i += 1
    print("\n字符不同个数为 %d\n文本长度差为 %d"%(a,abs(l1-l2)))

在评论区看到alpha通道(透明度)也是最大255的参数
于是又改写了份四参数处理的代码(即一个像素包含两个字符)

from PIL import Image

a = input("1.小说生成图片\n2.图片还原小说\n3.输出结果比较测试\n输入命令序号:")
if a == '1':
    f = open("斗罗大陆.txt","r")
    txt = f.read()
    # 动态分配图片大小
    box = int((len(txt) / 2) ** 0.5) + 1
    img = Image.new("RGBA",(box,box),(0,0,0,0))
    # x为横轴,y为纵轴
    x = 0
    y = 0
    # s为0时写入rg,为1时写入b和alpha通道 
    s = 0
    # 单次计数器
    num = 0
    print("生成图片中 Loading...")
    for t in txt:
        t = str(hex(ord(t)))
        l = len(t) - 2
        list = ["0"]*4
        i = 0
        b = -1
        alpha = -1
        while i < l:
            list[i+4-l] = t[i+2] # 顺序赋值
            i += 1
        if x == box:
            x = 0
            y += 1
        # 写某个像素位置的值
        if list != ["0"]*4:
            if s == 0:
                r = int(list[0]+list[1],base=16)
                g = int(list[2]+list[3],base=16)
                s = 1
            elif s == 1:
                b = int(list[0]+list[1],base=16)
                alpha = int(list[2]+list[3],base=16)
                img.putpixel((x,y),(r,g,b,alpha))
                s = 0
                x += 1
    # 处理奇数长度最后的字符
    if x == box:
        x = 0
        y += 1
    if s == 1:
        img.putpixel((x,y),(r,g,0,0))
    img.save("小说.png","png")
    f.close()
    print("\n处理完成,输出:小说.png")
elif a == '2':
    im=Image.open("小说.png")
    w, h = im.size
    txt = ""
    # x为横轴,y为纵轴
    y = 0
    print("图片处理中 Loading...")
    while y < h:
        x = 0
        while x < w:
            rgba = im.getpixel((x,y))
            t1 = rgba[0] * 256 + rgba[1] # 顺序赋值,直接计算
            t2 = rgba[2] * 256 + rgba[3]
            # 正常情况
            if t1 != 0 and t2 != 0:
                txt += chr(t1)+chr(t2)
            # 剩余一个字符的情况
            elif t2 == 0 and t1 != 0:
                txt += chr(t1)
            # 字符已处理完成
            else:
                break
            x += 1
        y += 1
    f = open("小说.txt","w",encoding="utf-8")
    f.write(txt)
    f.close()
    print("\n处理完成,输出:小说.txt")
elif a == '3':
    f1 = open("斗罗大陆.txt","r")
    f2 = open("小说.txt","r",encoding="utf-8")
    t1 = f1.read()
    t2 = f2.read()
    l1 = len(t1)
    l2 = len(t2)
    i = 0
    a = 0
    print("文本比较中 Loading...")
    while i < l1 and i < l2:
        if t1[i] != t2[i]:
            a += 1
        i += 1
    print("\n字符不同个数为 %d\n文本长度差为 %d"%(a,abs(l1-l2)))

注意:当字符长度为奇数时,最后字符要特殊处理
处理完成的图片比之前的缩小很多,宽高长度大约为原来的二分之根号二
测试结果
字符不同个数为 0,文本长度差为 0(就很舒服)

系统适用行业: 视频拍摄制作(微电影、广告片、宣传片) 、商品展示短视频(食品/鞋服/美妆/母婴等) 、创意广告片(剧情大片/宣传片)、视频拍摄(企业宣传片、广告片、创意视频) 、美食加工过程短视频、商品展示短视频、商品展示短视频(食品/鞋服/美妆/母婴等) TVC广告、影视剧制作、创意TVC广告片、视频制作拍摄(宣传片、产品视频、TVC、广告、动画课程)等 功能简介:  站群 一个后台管理N个网站数据互通,每个网站可以单独绑定域名,单独设置SEO信息,单独设置LOGO,单独广告等   视频打赏 用户可以对视频上传作者进行各种礼物打赏,打赏所得金额作者可拿到对应的提成收入,所得收入可人民币提现   三级分销 三级分销商可以拥有独立的分销商网站独立的管理后台,并且可以自定义绑定域名,可统计每天收益基本设置等   多线路播放 支持多服务器线路播放视频,不同的会员级别可指定观看不同的播放线路解决宽带负荷,从而提高会员的积极消费   视频上传提成 用户在线上传的视频,如该视频被其他用户比如10个金币消费了,发布视频者可得到如3个金币的奖励   视频试看限制 PC端可自定义设置视频试看时间超出时间提示购买VIP,手机采取每天试看次数超出次数提示购买VIP   自动转码 结合云转码软件实现站长/用户上传视频支持任意格式转码,生成视频图片、名称、播放地址、完全自动   每天签到 用户每天签到可得到系统自动奖励的金币,24小时允许签到一次,从而提高用户对网站的黏贴度哦   分享奖励 用户登陆会员心获取宣传地址分享到QQ、论坛、微信等,不同IP被点击一次奖励指定的消费金币   卡密充值 用户可凭卡密在会员心进行充值获取金币,后台可生成卡密的金币数直接到发卡平台销售   播放器广告 整合Ckplay播放器,后台可控制加入播放前载入广告,暂停播放广告可开启/关闭广告   支付体系 整合流行支付接口,比如微信支付,支付宝支付等以及第三方支付平台   APP应用 封装安卓APP应用以及苹果APP应用,封装手机端数据同步自动更新   会员在线上传 用户可通过电脑、手机端在线上传视频以及发布图片小说等,实时分享到网站   上传视频奖励 用户上传视频一经站长后台审核通过,该用于将得到系统奖励的金币   防盗链加密 结合云转码可现实防盗链,从而不用担心自己视频资源被盗链,除此之外播放地址我们还做了加密使资源更安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值