2010-08-05 53 views
7

我的程序產生3000x3000像素,一個接一個的10×10格的圖像(目前保存的100個文件名爲image_x_y.jpg如何從java中的多個tile創建一個大的圖像文件?

我想這100張圖像組合成一個大的圖像,而無需加載在內存中的一切。我的目標是創建一個30'000 * 30'000像素的大圖像文件。

我正在尋找一種方式來做到這一點不使用JAI(不能從公共Maven倉庫安裝了,我不明白爲什麼)

有沒有辦法用純的Java2D做到這一點?還是有另一個圖書館存在,能夠處理這個?

我最初的想法是創建一個非常大的緩衝圖像,從DataBuffer支持到磁盤上的文件。但我不確定這是可能的。有沒有人做過這個?

回答

6

我想將這100個圖像組裝成一個大圖像,而無需在內存中加載所有內容。我的目標是創建一個30'000 * 30'000像素的大圖像文件。

我相信在JAI中有一個類可以做到這一點。無論您將JAI整合到您的項目中是否存在任何問題,我都會堅持而不是推出自己的版本。 Java2D中沒有這樣的東西。

我最初的想法是創建一個非常大的緩衝圖像,從DataBuffer支持到磁盤上的文件。但我不確定這是可能的。有沒有人做過這個?

是的我寫了一個不完整的實現。它由

  • 由一個ByteBuffer而不是數組支持的DataBuffer(如果緩衝區指揮它可以映射到一個文件中。)
  • 一個WritableRaster類似於標準的柵格,但使用我的實現的DataBuffer(標準JDK中作弊被抱着支持數組引用柵格。有一個在直接ByteBuffer的情況下沒有數組所以很遺憾,你必須重新實現最Raster方法。)

我做不建議延長SampleModel,因爲您的班級將不能與JDK柵格一起工作(Java2D中的各種方法,包括Raster工廠方法會在SampleModel的開關類型上假設它是標準方法之一。糟糕的設計恕我直言,但你可以做的不多,除非遵循相同的模式。)

+0

好吧,它明確表示使用JAI是最聰明的解決方案。我會繼續這種方式,並不會自己處理圖像。 – 2010-08-06 05:37:06

+1

有關如何實現這一點的更多細節將受到歡迎 – 2011-05-12 17:22:51

1

我不知道是否有可能沒有加載到內存中。您可以將所有圖像轉儲爲未壓縮的bmp,​​然後使用一些外部工具將其轉換爲jpg。

+0

未壓縮的文件會很大。每像素24位,每塊大約30MB。 (請參閱http://en.wikipedia.org/wiki/BMP_file_format)。我真的認爲它會回報看看不同的實現。 – extraneon 2010-08-05 09:37:11

1

如果您在使用公共maven存儲庫中的資源時遇到困難,您可能需要使用Nexus作爲maven代理,並手動添加JAI在那裏jar(並將其添加到您的存儲庫列表中)。

選擇這個解決方案的好處是你可以擁有JAI,並且可以通過maven的方式使用非maven資源(所有的javax庫)。

由於涉及到所有的壓縮,處理BMP上的圖像大小(大約100 * 30MB = 3GB)可能不是最佳也不快速,所以不要繞着你自己擺弄這個問題。

1

解決方案是BigBufferedImage。它可以加載和存儲比內存限制大得多的圖像。訣竅是它的緩衝區被替換爲基於文件的DataBuffer實現。它將解碼後的原始圖像數據存儲在文件中。沒有使用RAM。這可以防止OutOfMemoryException。

有關大圖像處理read this article的更多信息。

相關問題