折腾你的浏览器 —— 把10000x10000的PNG图片缩到200字节!
别紧张别怀疑,楼主可不是在故弄玄虚忽悠人:)事实上这还不是最小的!小弟先抛个砖,希望大家继续探索。
本文没有耍一点花招,都是最最基础的技术。即使是再菜的菜鸟也知道,想把一亿像素的照片保存进几百字节那是完全不可能的,更何况还是无损。事实上呢也的确不可能,因为本文标题里没说是照片,而是图片,毫无实际内容的图片:)
但也必须是标准的,通用的,能被各种浏览器识别的图片(PNG,GIF,JPG...)。自己代码定义的当然是不能算的~
大家平时也遇到过,一些截图保存成png格式会小很多很多,而且画质完全没变。原因很简单,图片里的颜色数少,而且有大量的重复空白。经过zip压缩之后,相同二进制数据都被合并掉了,产生冗余很小的数据。而且是无损压缩,所以画质不会下降。
所以现在来创建一个重复数据特别多的图,由于本人没有深入研究过zip的具体实现,不知道怎样才算冗余最大的数据,希望哪位懂的大虾不吝赐教。不过可以肯定的是,一张纯色图片冗余是非常大的。为了简单,用画笔创建一个10000x10000位图,随便填充个颜色,保存。MyGod, 286M!(其实再大点也没问题,但一些程序就不认了)
然后用大名鼎鼎的工具pngout狠狠的压。一杯茶的工夫完事了。。。变成200字节了?当然是————不可能滴。不过成绩也不错:11.9k。小了20000多倍,还是灰常牛X滴~
不过这280M的图片里99.9999%以上都是同样的内容,真正的内容仅仅是几十字节文件头而已,结果仍有10多k,多少有些不甘心。但光有文件头,没有实际数据内容,图片也是不能被识别的。也许对于deflate这样的压缩算法,已经是竭尽全力了。会不会在这11.9k的数据里,仍然有很大的冗余?一般来说,经过压缩的文件再压是毫无意义的,甚至还会变大。
不过对于一颗超新星来说,即使坍塌了几万倍也远没达到致密状态,只有黑洞才是它真正的目标。
但图片内部只能压缩一次,讨论继续压缩有何意义呢?别忘了,这不是一般的图片,这是一张放在网络上的图片。也许你早就想到了,在网络传输的时候,我们可以使用gzip再压缩一次!
这一压不得了,一颗真正的黑洞诞生了 ———— 202字节!
这202字节要是挥发出来有多可怕呢?如果将它嵌在贴吧论坛的贴图里,仅仅一个就可以吃到300M的内存!多嵌几张那就更多了- -
开头也说了,这还不是极限。这仅仅是利用现成工具创造的,如果能分析了解deflate算法中的细节,那肯定能创造更致密的黑洞!!!
由于图片尺寸巨大,就不嵌在本文内了。可以去这里预览:
http://www.etherdream.com/Test/blackhole.html
最终压缩的文件:
http://www.etherdream.com/Test/blackhole.png.gz
当然,即使几百M的内存消耗,对于目前动辄数G内存的电脑来说可以完全无视。不过能做一个有几千倍压缩率的zip文件的话,就可以做恶作剧了:用户访问了论坛里某个几百k的内嵌图片后,硬盘里留下了几百M的缓存文件!这算不算是恶意破坏呢?