2011-09-07 63 views
2

我正在構建一個應用程序,該程序在用戶在Windows桌面上執行「錄製」操作的過程中需要大量截圖。用於無損壓縮系列截圖的適當圖像文件格式

由於顯而易見的原因,我想以儘可能高效的方式存儲這些數據。

起初我想過使用PNG格式來完成這件事。但我偶然發現:http://www.olegkikin.com/png_optimizers/

最好的算法只能在GUI圖標的圖像上管理3到5個百分點的改進。這非常令人沮喪,並且顯示出我需要做得更好,因爲使用PNG不會讓我使用以前的幀來幫助壓縮比。文件大小將隨着時間的推移而持續增長。

我想過解決這個有點破解:只需將幀保存在一些數字的組中,並排。例如,我可以將10 1280x1024捕獲的內容存儲在一張1280x10240圖像中,那麼壓縮應該能夠利用相鄰圖像間的重複。

但是,這個問題是,用於壓縮PNG的算法不是爲此設計的。我以任意1024點的間隔任意放置圖像,一次只能將10個圖像組合在一起。根據我在幾分鐘後掃描PNG規格時所收集的信息,壓縮在各個掃描線上(經過濾)然後分塊在一起,所以實際上沒有辦法從下面的1024像素以上引用信息。

所以我找到了擴展PNG允許動畫的MNG格式。這對我所做的更合適。

我擔心的一件事是,用新框架「擴展」圖像/動畫有多大的支持。我的應用程序中數據生成的本質是,新的框架會定期添加到列表中。但我對這個問題有一個簡單的半解決方案,即緩存最近生成的數據塊,並逐漸產生一個「動畫」,比如每10幀。這樣可以讓我只在RAM中捆綁10幀未壓縮的圖像數據,不如立即將其卸載到文件系統,但這並不可怕。在整個過程完成後(或者甚至在空閒線程中使用空閒循環,在執行期間),我可以輕鬆地返回並將10個組連接在一起,如果它甚至值得這樣做。

這是我的實際問題,一切都一直領先。 MNG是我的要求的最佳格式?這些要求是:1. C/C++實現可獲得許可許可,2. 24/32位色,4+百萬像素(有些人運行30英寸顯示器)分辨率,3.無損或接近無損(保持文本清晰度)壓縮規定引用前面的幀來幫助壓縮。

例如,下面是我想過的另一個選項:視頻編解碼器。我希望擁有無損的質量,但我已經看到h.264/x264的例子可以再現非常清晰的劇照,而且它的表現讓我能夠以更快的速度拍攝。我懷疑我只需要實現這兩個方面,並做我自己的基準測試,以充分滿足我的好奇心。

回答

3

如果您有權訪問PNG壓縮實施,那麼您可以輕鬆優化壓縮,而不必像前一個預處理「下一張」圖像那樣使用MNG格式。如果屏幕截圖變化不大,這種方法很幼稚但有效,而「幾乎空」的PNG壓縮將大大減少所需的存儲空間。

+0

這是很好的見解。我開始閱讀MNG文檔,並注意到他們有一個叫做「Delta-PNG」的東西,就像聽起來一樣。從概念上講這很簡單(這很棒),並且確實解決了這些問題。如果沒有人提供有關視頻流的有趣信息,我會接受此答案。 –