我正在开发一个程序,它接受一个字符串,将字符串的每个字符变成一种颜色,然后在图像上从左到右,从上到下绘制颜色.然后可以使用相同的程序对图像进行解码以获得原始消息.举个例子,这里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上提出了一个更好的方法,但我还没有实现它.由于结果是相同的,这不应该对问题产生影响.
便携式网络图形(PNG)是一种光栅图形文件格式,支持无损数据压缩(来自https://en.wikipedia.org/wiki/Portable_Network_Graphics),哇.当存储为.png文件时,图像数据被压缩.