V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shintendo
V2EX  ›  问与答

有什么把大量文本编码到图片里的方案吗?

  •  
  •   shintendo · 2020-09-21 23:49:46 +08:00 · 2135 次点击
    这是一个创建于 1523 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的需求:一个客户端,可以生成一张图片,其中要包含大约几千字的信息,这张图片通过 QQ 发送,对方从 QQ 上复制图片后,可以通过他的客户端还原出这些信息。

    我的问题:通过什么方式编码这个图片,能使图片的尺寸比较小?

    我第一反应是 qrcode,但我这个文字量,生成出来的码尺寸太大了。我这个场景不需要高容错能力,也不需要限制黑白两色,所以按理说可以更高效的才对。

    有什么其它类似的替代方案吗?

    第 1 条附言  ·  2020-09-22 14:13:07 +08:00
    是这样的, 客户端是一个棋盘小游戏,一个人走完以后点击确定,生成盘面截图,图里还有一个二维码包含棋局数据,图片发到 QQ 群里,群友用他的客户端读取图片后接着玩。现在的问题就是二维码太大了,几乎跟棋盘一样大,不好看。

    确实可以数据存服务器上,通过网络获取,不过还是想了解下有没有纯本地解决方案。这个就是图一乐,不是正儿八经的应用。

    另外不需要加密,也不需要隐藏这些数据。
    21 条回复    2020-09-22 15:59:11 +08:00
    misaka19000
        1
    misaka19000  
       2020-09-21 23:51:20 +08:00
    为什么非得是图片
    cat
        2
    cat  
       2020-09-21 23:55:43 +08:00   ❤️ 2
    别说几千字,包含一首歌都没问题,远古技术:图种
    mumbler
        3
    mumbler  
       2020-09-21 23:58:36 +08:00 via Android
    写入 txt 文件,7z 压缩加密,后缀改成 jpg
    CismonX
        4
    CismonX  
       2020-09-22 00:12:15 +08:00
    搜那些薅图床的工具就能找到不少现成的实现

    比如这个: https://github.com/apachecn/CDNDrive/blob/master/CDNDrive/encoders/PngEncoder.py

    这类工具能正常工作的前提是 QQ 存的是原图
    Jirajine
        5
    Jirajine  
       2020-09-22 00:12:35 +08:00 via Android
    直接用 RGB 表示原始二进制数据然后编码成 png,只要确保接受到的是原始文件当然就可以还原。
    supermoonie
        6
    supermoonie  
       2020-09-22 00:23:58 +08:00 via iPhone
    @Jirajine 🉑️
    lcdtyph
        7
    lcdtyph  
       2020-09-22 00:26:51 +08:00
    关键字:隐写术
    cheng6563
        8
    cheng6563  
       2020-09-22 00:32:55 +08:00 via Android
    以前我都是把一个 iTunes 塞进 jpg 里
    然后放到 iPhone 相册里
    xiri
        9
    xiri  
       2020-09-22 00:55:20 +08:00 via Android
    我曾经做过一种实现:利用图片像素值的奇偶性来存储二进制数据。
    比如用偶数像素值表示 0 、奇数像素值表示 1 。将待存储数据转成二进制,然后给定一张图片,遍历其每一个像素,根据二进制数据将对应像素加 1 或者维持不变( 255 时减 1 ),最后在存储数据的像素区段开头和结尾加上特殊的奇偶序列用作标志位即可。
    读取数据时只需要遍历像素找到标志位,然后根据两个标志位之间像素的奇偶性即可还原出原始二进制数据。

    这样做的好处就是对图片的破坏性很小,只是将少量像素的值加了 1 而已,存储数据的图片跟原图肉眼看不出区别,也没有强行附加非图片数据在图片文件中,计算下来一张 1080x1920 的 3 通道图片可以存储 700kb 左右的数据。
    问题的话就是图片数据隐藏在像素值中,因此图片不能被压缩( jpg 这种自带压缩的图片格式也不能用),另外实际测试发现存储数据后图片文件一样的会增大。
    xiri
        10
    xiri  
       2020-09-22 01:02:52 +08:00 via Android
    @xiri 不管是通过像素值加 1 还是减 1 来修改奇偶性,图片文件都会增大
    jim9606
        11
    jim9606  
       2020-09-22 01:39:09 +08:00
    如果传原图,那大也无所谓。如果用了有损压缩,那你用彩色都不完全可靠。

    @cat 图种这种走实现漏洞的做法未必管用。
    wiix
        12
    wiix  
       2020-09-22 01:56:36 +08:00
    直接用 byte 数组填充 RGB 数据然后保存为 png 就行了,如果需要容错就把 1byte 数据拆成 4 段然后每段再*4,这样每 4 个像素存 3byte,压缩成 jpg 应该也能还原。
    MintZX
        13
    MintZX  
       2020-09-22 02:47:02 +08:00
    都客户端了,都 QQ 了,说明这个终端设备是联网的。那你这些信息为什么要放到图片上。。。放在服务器上不好吗?
    imn1
        14
    imn1  
       2020-09-22 02:58:47 +08:00
    无需加密的话,append 到 jpg 后面就行


    加密的话
    stegraphy
    搜这个一大堆工具,还有开源代码,按需取用
    clf
        15
    clf  
       2020-09-22 09:09:36 +08:00
    技术上没什么坑,通过网络发送的话有几点需要注意,只有以原图发送信息才不会丢,像 QQ 、微博、微信如果不是以原图发送,则会出现信息丢失。
    ciaoly
        16
    ciaoly  
       2020-09-22 10:15:31 +08:00 via Android
    前两天看到个通过调频向图片中附加数据的方式,主要优点是抗图片压缩、抗裁剪损毁,可以试试。

    https://www.zhihu.com/question/50735753/answer/122593277
    shintendo
        17
    shintendo  
    OP
       2020-09-22 14:08:24 +08:00
    @misaka19000
    @MintZX

    是这样的, 客户端是一个棋盘小游戏,一个人走完以后点击确定,生成盘面截图,图里还有一个二维码包含棋局数据,图片发到 QQ 群里,群友用他的客户端读取图片后接着玩。现在的问题就是二维码太大了,几乎跟棋盘一样大,不好看。

    确实可以二维码只包含链接,客户端访问链接获取数据,不过还是想了解下有没有纯本地解决方案。
    shintendo
        18
    shintendo  
    OP
       2020-09-22 14:10:17 +08:00
    @cat
    @mumbler
    @Jirajine
    @cheng6563
    @xiri
    @wiix

    类似图种这种二进制方式,经过 QQ 的压缩会被破坏吧?
    wakzz
        19
    wakzz  
       2020-09-22 15:52:10 +08:00
    @shintendo 你这个场景,最重要的是兼容性问题。大多数用户在分享图片时,是不会注意勾选发送原图的按钮。因此就必须考虑用户图片被压缩的情况。楼上方案中图片直接二维码包含链接的形式就很通用,比较适合这种场景。
    wakzz
        20
    wakzz  
       2020-09-22 15:53:57 +08:00
    甚至更甚一步,分享的内容直接以文本口令的形式替代,例如淘宝的分享口令。
    shintendo
        21
    shintendo  
    OP
       2020-09-22 15:59:11 +08:00
    @wakzz 客户端是 PC 的,所以用的 QQ 也大概率是 PC,PC 版没有发送原图选项吧?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2749 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:45 · PVG 17:45 · LAX 01:45 · JFK 04:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.