2012-05-17 76 views
6

我需要用PixelFormat.Format24bppRgb編碼創建一個巨大的圖像(aprox 24000 x 22000)。我知道這將幾乎不可能打開它...在C中生成巨大的圖像#

我想要做的是這樣的:

Bitmap final = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

正如預期的那樣,因爲我不能處理的11GB文件拋出一個異常記憶容易的方式。

但我有一個想法:我可以寫文件,因爲我生成它?所以,我不是在研究RAM,而是在研究HD。

只是爲了更好地解釋:我有大約13K的瓷磚,我打算把它縫在一起在這個愚蠢的humongous文件。因爲我可以按順序迭代它們,所以我可以使用不安全的代碼直接寫入內存。

有什麼建議嗎?

+0

而不是非託管代碼,請閱讀不安全的代碼... –

+4

請參閱[內存映射文件](http://msdn.microsoft.com/en-us/library/dd997372.aspx)。 – GSerg

+1

@GSerg內存映射文件_can_可用於打開/編輯大文件中的節......但它的** NOT RECOMMANDED **在內存映射文件中創建這些大文件!!! –

回答

2

你可以用像BMP這樣的非壓縮格式編寫它。 BMP將原始顏色字節保存在行中。因此,您將加載第一排拼貼,讀取其單獨的像素行並將其作爲複合單行寫入輸出圖像中。這樣,你可以只打開幾塊瓷磚並立即寫下輸出圖像。

但我不知道如何將它寫成壓縮圖像,如JPG或PNG。但我確信有一些專門的軟件可以用於此目的。

+0

我有你的想法,這是一個好方法,但有一個問題:由於Bitmap類檢查系統是否可以處理這樣的大文件,它不會讓我通過新的Bitmap()。 –

+1

這裏的關鍵是,你不應該使用任何內置類來進行圖像處理。你應該做到這一點。正如我所說,使用BMP,這是極其簡單的原始圖像格式,你可以在沒有任何複雜的壓縮算法的情況下編寫。 – Euphoric

+0

嗯......現在我明白了。這確實是一個好主意!我會試一試!謝謝! –

0

根據你在完成這個圖像後打算做什麼,我會建議將它分成4份,並用這種方式處理。我已經使用了10,000 x 10,000像素而沒有引發OOM異常。

+0

現在這正是我所做的,這是一個有效的解決方法,但由於我沒有急於創建這些文件,我正在研究解決這個問題的方法! –

+0

FWIW,我發現保持低於8192 x 8192像素更安全。特別是如果同時在內存中保存多個紋理(例如,從一個複製到另一個)。 – ToolmakerSteve

3

ImageMagick的Large Image Support(tera-pixel)可以幫助您在將圖像組合在一起後將圖像放在一起。您可以使用命令行並使用this包裝向其發出命令,也可以使用此ImageMagick.NET作爲API。

+0

看起來很有前途!我會看看這個API!謝謝! –

+0

ImageMagik的更新版本。NET http://magick.codeplex.com/ – Jonathan

+0

感謝您對ImageMagick.NET的鏈接 - 我之前沒有注意到這一點。 – ToolmakerSteve