将字符串编码为图片会导致压缩

时间:2017-01-22 22:15:51

标签: encryption clojure compression bufferedimage

我正在处理一个带字符串的程序,将字符串的每个字符变成一种颜色,然后在图像上从上到下,从上到下绘制颜色。然后可以使用相同的程序对图像进行解码以获得原始消息。例如,这里的clojure.core编码为图像:

Clojure.core encoded as an image

我把它写成一个玩具,但我注意到它产生的图像有趣的属性:它们比原始信息的文本要小。对于clojure.core,它是259kb作为文本,但只有88.9kb作为图像(上图)(两个值都是"磁盘上的大小")。为了确保数据不会丢失,我对图像进行了解码,并将原始信息恢复原状。

这怎么可能?我认为图片(png格式)会有标题和其他额外信息,这些信息会增加尺寸。

整个clojure.core包含265486个字符(根据Notepad ++),这意味着每个字符基本上占用一个字节。

从使用BufferedImage类(Java),看起来好像颜色存储为4字节整数,所以不应该每个像素需要大约4倍的内存?

以下是它的编码方式:

  1. 弹出字符串的第一个字符

  2. 通过获取它的ASCII值,将其乘以一个大数字(因此它更好地覆盖了可能的颜色范围),将其转换为颜色,然后将该数字转换为3位数,基数256([123 100 200])。

  3. 每个数字都被视为红色,绿色和蓝色通道,这些通道被赋予BufferedImage setRGB方法。

  4. position指示符已高级,弹出下一个字符,重复此过程,直到整个邮件编码完毕。

  5. 这个算法现在有点复杂。 @Thumbnail在Code Review上提出了一个更好的方法,但我还没有实现它。由于结果是相同的,这不应该对问题产生影响。

1 个答案:

答案 0 :(得分:7)

便携式网络图形(PNG)是一种光栅图形文件格式,支持无损数据压缩(来自https://en.wikipedia.org/wiki/Portable_Network_Graphics),哇。存储为.png文件时,图像数据会被压缩。