折騰你的瀏覽器 —— 把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的緩存文件!這算不算是惡意破壞呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM