我正在处理一个带字符串的程序,将字符串的每个字符变成一种颜色,然后在图像上从上到下,从上到下绘制颜色。然后可以使用相同的程序对图像进行解码以获得原始消息。例如,这里的clojure.core
编码为图像:
我把它写成一个玩具,但我注意到它产生的图像有趣的属性:它们比原始信息的文本要小。对于clojure.core
,它是259kb作为文本,但只有88.9kb作为图像(上图)(两个值都是"磁盘上的大小")。为了确保数据不会丢失,我对图像进行了解码,并将原始信息恢复原状。
这怎么可能?我认为图片(png
格式)会有标题和其他额外信息,这些信息会增加尺寸。
整个clojure.core
包含265486个字符(根据Notepad ++),这意味着每个字符基本上占用一个字节。
从使用BufferedImage
类(Java),看起来好像颜色存储为4字节整数,所以不应该每个像素需要大约4倍的内存?
以下是它的编码方式:
弹出字符串的第一个字符
通过获取它的ASCII值,将其乘以一个大数字(因此它更好地覆盖了可能的颜色范围),将其转换为颜色,然后将该数字转换为3位数,基数256([123 100 200]
)。
每个数字都被视为红色,绿色和蓝色通道,这些通道被赋予BufferedImage
setRGB
方法。
position
指示符已高级,弹出下一个字符,重复此过程,直到整个邮件编码完毕。
这个算法现在有点复杂。 @Thumbnail在Code Review上提出了一个更好的方法,但我还没有实现它。由于结果是相同的,这不应该对问题产生影响。
答案 0 :(得分:7)
便携式网络图形(PNG)是一种光栅图形文件格式,支持无损数据压缩(来自https://en.wikipedia.org/wiki/Portable_Network_Graphics),哇。存储为.png文件时,图像数据会被压缩。