2010-06-04 36 views
4

我目前使用MFC/GDI和Stingray在我的應用程序中顯示位圖,並且正在尋找更好的解決方案。特別;任何用於顯示大型位圖的良好C++庫

  • 更快的繪圖速度 - 我現在的解決方案是緩慢的,基於的StretchDIBits
  • 更好的渲染質量 - 的StretchDIBits縮放位圖旋轉的位圖
  • 支持時渲染質量是可怕的
  • 支持加載/保存在所有流行的格式
  • 支持大的位圖 - 我經常使用的航空照片是〜64mb的12,000x12,000 jpegs。 GeoTIFF文件的支持也將是有益的
  • 與MFC文檔/視圖,包括打印兼容(如必須能夠呈現到CDC)
  • 訪問源代碼,是好的,但沒有必要
  • 易於使用/端口現有的GDI代碼

雖然免費總是很好,但我不介意花費一個合理的金額在一個體面的圖書館,雖然沒有運行時間的版稅費用。谷歌搜索建議如下;

任何人得到的這些經驗或能推薦一個很好的替代品?

+2

我看到您將JPEG的縮放比例超過了8倍。在這種情況下,您應該在JPEG級別完成縮放,而不是位圖。這是*方式*更快。 JPEG使用傅立葉分量壓縮8x8像素的塊。顯式存儲的{0,0}組件是平均值。因此,將JPEG圖像縮小8倍是血腥快速和相當平凡的。您會從12000 * 12000像素JPEG中獲得1500 * 1500的位圖,並且很可能您的磁盤速度將成爲此處的限制因素。 – MSalters 2010-06-04 11:59:59

+0

@ MSalters,很好的評論,並且我使用的命令是StretchDIBits,我猜你說的是真的。更有理由採用不同的方法。 – 2010-06-04 13:48:04

回答

2

我認爲你不可能在windows上發現比在GDI上執行更快的,因爲它具有內核級支持,這是開源解決方案所不具備的。

您可能還想看看OpenGL或Direct2D/Direct3D,因爲它們也可以直接訪問幀緩衝區。使用3D API時,紋理大小可能會成爲一個問題,因爲大多數標準限制在4096x4096之類。

+0

我不相信速度的事情。如果我沒有縮放位圖,這可能是正確的,但StretchDIBits在縮放和繪製一個4000x4000像素位圖(例如300x300像素框)時看起來並不快。它也會產生可怕的結果。關於StretchDIBits速度的以下討論也很有趣http://www.gamedev.net/community/forums/topic.asp?topic_id=344785 – 2010-06-04 10:07:19

+0

移動整個過程OpenGL肯定值得考慮,儘管可能會涉及很多工作和在印刷方面造成問題。 – 2010-06-04 10:20:58

+0

StretchDIBits做一個簡單的最近鄰居縮放。對於某些應用程序而言,這正是您想要的,而不是別的。 (例如圖像編輯器縮放) – shoosh 2010-06-04 18:26:33

2

我已經在過去使用過CxImage這是一個添加到您的評估列表。

+0

+1看起來不錯,謝謝發佈! – 2010-06-04 10:39:32

3

自早期XP以來,任何Windows機器上都可以使用GDI +。它具有所有流行圖像格式的編解碼器,包括JPEG。非常好的濾鏡可以進行高質量的圖像縮放。無限制的圖像旋轉。通過Graphics類繪製到CDC。 SDK gdiplusXxx.h頭文件提供了C++包裝的源代碼。速度可能相當,但渲染是基於軟件的,以確保兼容性。

您可以#include <gdiplus.h>並直接使用C++包裝。 SDK文檔are here。 CImage類在MFC中可用,但它不公開所有功能。

+0

+1這可能是一個很好的第一步,因爲它應該是一個非常簡單的端口。我一直有意從GDI換到GDI +一段時間,所以現在可能是時候咬緊牙關了。 – 2010-06-04 13:46:20