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

Encoding a String as a picture causes compression

我正在开发一个程序,该程序接受一个字符串,将字符串的每个字符转换为一种颜色,然后在图像上绘制颜色 left-to-right、top-down。然后可以使用相同的程序对图像进行解码以取回原始消息。例如,这里是 clojure.core,编码为图像:

我写这个只是作为一个玩具,但我注意到它生成的图像中有一个有趣的 属性:它们比原始消息的文本要小。对于 clojure.core,它作为文本是 259kb,但作为图像(上图)只有 88.9kb(两个值都是 "size on disk")。为了确保数据不丢失,我对图像进行了解码,并取回了原始消息。

这怎么可能?我认为图像(png 格式)会有 headers 和其他会膨胀大小的额外信息。

整个clojure.core包含265486个字符(根据Notepad++),也就是说每个字符基本占一个字节。

从使用 BufferedImage class (Java) 来看,颜色似乎存储为 4 字节整数,所以每个像素不应该需要 ~4x内存?

编码方式如下:

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

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

  3. 每个数字都被视为红色、绿色和蓝色通道,它们被赋予BufferedImagesetRGB方法。

  4. position指示器前进,弹出下一个字符,重复该过程,直到整个消息被编码。

算法现在有点复杂。 @Thumbnail 建议了一种更好的代码审查方法,但我还没有实现它。由于结果是相同的,所以这对问题没有影响。

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