2012-07-29 147 views
3

我需要在內存中使用BMP(作爲HBITMAP或CImage存儲),並將其保存到磁盤上的PNG文件中。使用C++將BMP保存爲PNG(VS 2010)FAST

這是我目前如何將圖像保存爲PNG。 CImage img; img.Save(「foo.png」)

我的問題是太慢了(250ms〜1920X1080)。這需要以JPG格式保存3倍的時間,並且保存爲BMP的時間約爲9倍。

我知道有很多用於linux的g ++庫(例如libpng)會這樣做,但是大多數支持visual studio的庫只支持版本6,而且我還沒有找到一個具有基準的庫,所以我有些猶豫,試圖讓這些圖書館工作只是爲了發現他們太慢了。

我不知道什麼類型的編碼器窗口使用(它隱藏在DLL中),但必須有更快的一個(我甚至願意犧牲一點點的磁盤大小,多達兩倍)。

Java庫很快就做到了這一點,但由於某種原因,微軟的圖書館作爲一隻烏龜很慢。

所以我想知道我有什麼選擇將屏幕大小的PNG保存到磁盤上〜100ms?

+0

你可以使用4:4:4(無色失真)JPG編碼器設置爲無損質量嗎? – 2012-07-29 23:47:44

+0

是的,Microsoft Library中是否有內置的HBITMAP/CImage易於創建? – 2012-07-30 03:55:49

+0

我不知道我的頭頂上有一個,但我在那裏拋出它,以防你不必要地限制你的搜索空間,假設你有*有* png。 基於DCT的圖像編碼算法(jpg等)具有一些很好的數據並行方面,並且通過SSE指令可以很好地加速,因此我認爲您應該尋找體面的無損JPG代碼。 – 2012-07-30 04:12:34

回答

0

自己編譯libpng非常容易。我只是自己做了這個之前打出這個resposne。花了大約90秒。

  1. 下載的zlib從http://zlib.net/無論是在源或預編譯的形式,使得你從http://sourceforge.net/projects/libpng/files/libpng15/1.5.12/lpng1512.zip/download

  2. 的libpng解壓縮zip文件的內容zlib.h

  3. 下載的libpng。

  4. 打開命令shell。

  5. 「CD/DD:\項目\的libpng」(cd到任何目錄,你剛纔解壓縮從libpng的來源)

  6. 「複製腳本\ libpng.h.prebuilt libpng.h」

  7. 在libpng的目錄中創建一個新的Visual Studio C++項目(靜態庫)

  8. 從libpng的目錄添加所有的* .c文件到項目

  9. 添加你r zlib項目目錄到項目的包含路徑。 (無論它能找到zlib.h)

  10. 建立你的項目。它應該很好地編譯png代碼庫。完成。

+0

謝謝你試圖幫助,但我不想弄清楚如何轉換HBITMAP /除非我確定它會更快,否則libpng格式會接受。 – 2012-07-30 13:06:16

+0

@JohnWalters - 只有一個確定的方法可以確定libpng是否比GDI +更快... – selbie 2012-07-31 18:10:35

+0

對不起,如果我失敗了,我很快就會有一個截止日期,我想可能有另一個微軟庫可以做到這一點,或者至少有一個基準的圖書館,我相信你的步驟可以幫助任何人解決這個問題,並且有更多的時間在他們的手中:)。 – 2012-08-01 04:06:34

1

我敢打賭(但我沒有bencharks)libpng是最好的選擇。

至少,我會尋找一個庫,允許調整保存選項(CImage不)。有兩個相關的選項嘗試:

  1. zlib壓縮級別(0-9):典型的默認值(6)一般是沒有問題,你很少使用較少的壓縮獲益良多速度

  2. Filter type。這可能更重要。如果我們想優化速度,我會預先選擇一個獨特的過濾器(通常是PNG_FILTER_PAETH)。

+1

PNG_FILTER_NONE是最快的,通常對於顏色數量有限的圖像來說是最好的。 PNG_FILTER_PAETH對編碼和解碼速度較慢,但​​對自然圖像提供更好的壓縮。 – 2014-02-25 18:20:51