使用文本生成图像

时间:2017-05-20 16:37:48

标签: java image algorithm encoding graphics

我访问了这个网站, https://xcode.darkbyte.ru/

enter image description here

网站基本上将文本作为输入并生成图像。 它还将图像作为输入并将其解码回文本。 我真的想知道这是什么以及它是如何完成的 我想知道算法[最好用Java] 请帮助,提前致谢

1 个答案:

答案 0 :(得分:3)

有很多方法可以将文本(字节序列)编码为图像,但是您引用的网站以非常简单和直接的方式进行编码。您可以轻松地对其进行逆向工程:

  • 最多3个字符编码为1个像素; 4个字符作为2个像素 - 我们从中了解到每个像素只使用R(ed),G(reen)和B(lue)通道(而不是alpha /透明通道)。

  • 我们知道PNG每通道支持8位,每个ASCII字符为8位宽。让我们测试第一个字符(前8位)是否存储在红色通道中。

    • 让我们试试z..。由于z在ASCII表格中相对较高(122)且.相对较低(46),因此我们希望得到一个红色的1x1 PNG。我们这样做。
    • 让我们试试.z.。应该是绿色的..它是。
    • 同样地,对于..z,我们会得到一个带蓝色的像素。
  • 现在让我们看看非ASCII输入会发生什么。尝试输入:(unicode char \u2460)。网站html-encodes将字符串放入①,然后像以前一样将ASCII文本编码到图像中。

  • 压缩。输入大量文本时,我们注意到输出比预期的要短。这意味着后端在原始输入上运行一些压缩算法(或之后?)将其编码为图像。通过注意图像的分辨率和最大信息内容(HxWx3x8位)小于输入,我们可以得出结论,压缩是在编码到图像之前完成的,而不是在之后(因此不依赖于PNG压缩)。我们可以通过使用Huffman codingLempel-ZipLZWDEFLATE,甚至{{3}等常见罪犯对原始输入进行编码来进一步检测使用哪种压缩算法},并将输出与图像像素的字节进行比较。 (注意我们无法通过检查魔术前缀直接检测它,除了原始压缩数据之外,作者可能被剥离了。)