【问题标题】:Encoding a String as a picture causes compression将字符串编码为图片会导致压缩
【发布时间】:2017-06-07 09:30:53
【问题描述】:

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

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

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

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

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

这是它的编码方式:

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

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

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

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

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

【问题讨论】:

  • 尽管答案有些明显,但我仍然喜欢阅读您的发现。遇到这样的事情总是很有趣。

标签: encryption clojure compression bufferedimage


【解决方案1】:

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

【讨论】:

  • Doh。回想起来,这很明显。谢谢。
  • 可能值得一提的是,PNG 使用 Zlib/Deflate 压缩(并且直接在文本文件上使用 Deflate 可能会获得更好的结果)。
  • @haraldK 这也是我的期望。除了放气之外,png 还进行了预传递,有助于压缩“真实”图像(从统计上看,一个像素看起来非常像它的相邻像素)。您可以通过选择彼此接近的颜色来利用这一点(从而获得更好的 png 压缩)。不相关的是,通过每个像素编码多个字符(真彩色 + alpha png 图像每像素使用 64 位)来制作更小尺寸的图像可能是可行的——但这很可能不会压缩。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多