2010-04-24 95 views
0

我的程序具有將工作畫布的高分辨率圖像導出到磁盤的功能。用戶經常會嘗試導出大約20,000 x 10,000像素@ 32bpp的圖像,大約等於800MB。再加上在平均3D CAD程序中已經出現的嚴重內存消耗,你幾乎可以保證在32位平臺上出現內存不足的崩潰。創建巨大的圖像

因此,現在我正在導出用戶必須在像素編輯器中拼接在一起的1000x1000像素的圖塊。有沒有一種方法可以在用戶不做任何工作的情況下解決這個問題?

我想我可能會寫一個小的exe文件,它可以在命令行中插入進程並自動執行拼接。這將是一個獨立的過程,因此它將擁有2GB的RAM。或者還有更好的方法嗎?我想支持jpg,png和bmp,因此將圖像作爲字節流寫入磁盤並不是真的可行。

回答

1

如果你想這樣做的語言,激動,那麼你只有兩個選擇:

  • 要麼是因爲你做了或者
  • 做的專業圖形 應用做到這一點。他們保持 圖像磁盤上的全分辨率,但 當加載/保存他們不 一次加載/保存整個圖像 但在運行時在內存中創建這樣一個 基於磁貼的方法(只加載/保存目前相關的零件)。

第二個問題的缺點是你必須自己開發一切。您不能使用任何操作系統圖像處理,圖像編/解碼器或其他任何東西。

前段時間我有類似的問題,可以通過僅使用1/16bpp(特別是32位圖像通常包含8個完全未使用的位,不需要在內存中保存 - alpha通道)來解決它。這意味着我大部分都有一層1bpp圖像。但是,這顯然只適用於如果您使用自己的應用程序來使用圖像。

2

ImageMagick有一個名爲composite的組件。文檔沒有提到這個工具是否已經儘可能提高內存效率,但是不應該花很長時間才能發現。下載頁面是here。即時消息在所有主要平臺上均可用,隨附大量的API和接口,並且據我所知可以用作獨立的EXE或DLL。

如果複合材料不適合你,我敢肯定還有其他工具。這對於未壓縮的圖像數據可能是最容易實現的 - 我想不出將4個JPEG拼接在一起而不將所有JPEG存儲在內存中的方法(儘管我相信這一切已經完成)。

+0

謝謝佩卡,我會檢查出複合功能。我將無法使用我的安裝程序發佈ImageMagick,因此直接使用它們的功能已無法使用。 – 2010-04-24 11:14:05

+0

@大衛不客氣。但是如果你甚至不能發佈外部的DLL,那麼你肯定會推出自己的智能拼接/交換解決方案 - 這當然不是不可能的,而是一個堅強的破解!我確信有很多開源的拼接器可以獲得至少靈感。 – 2010-04-24 11:48:42

+0

我寫了一個小的控制檯應用程序,可以自動運行。這個過程不需要太長時間,但它仍然限制在32位操作系統上的2GB未壓縮的圖像數據。不過,我認爲大多數用途都應該沒問題。 – 2010-04-24 13:58:51