我正在开发一个程序,它将接受一个字符串,将字符串中的每个字符转换为颜色,然后从左到右、从上到下地在图像上绘制这些颜色。使用同一程序,可以解码图像以获取原始消息。例如,这是作为图像编码的
这怎么可能呢?我认为图像(
整个
从使用
以下是它的编码方式:
clojure.core
:
我写这个只是作为一个玩具,但我注意到它生成的图像具有一个有趣的特性:它们比原始文本消息要小。对于 clojure.core
,文本大小为259kb,但作为图像(如上所示),大小仅为88.9kb(两个值都是“磁盘上的大小”)。为确保数据未丢失,我解码了图像,并得到了原始消息。这怎么可能呢?我认为图像(
png
格式)会有头文件和其他额外信息,会导致大小膨胀。整个
clojure.core
包含265486个字符(根据Notepad++),这意味着每个字符基本上占用一个字节。从使用
BufferedImage
类(Java)的经验来看,颜色似乎存储为4字节整数,因此每个像素需要 ~4倍的内存?以下是它的编码方式:
弹出字符串的第一个字符
通过获取其ASCII值,将其乘以一个大数(以更好地覆盖可能的颜色范围),然后将该数字转换为3位、256进制数字(
[123 100 200]
)将其转换成颜色。每个数字都被视为红、绿和蓝通道,并传递给
BufferedImage
的setRGB
方法。位置指示器向前移动,弹出下一个字符,然后重复该过程,直到整个消息被编码。