2008-11-07 44 views
3

我有一個Eclipse RCP應用程序,它顯示大量(10k以上)的小圖像,像一個膠片一樣。對於每個圖像,我正在使用SWT Image對象。這會使用過多的內存和資源。我正在尋找更有效的方法。我想通過創建適當的總寬度,連續寬度(具有恆定高度)的ImageData對象並使用其他像素的setPixel()來連接所有這些圖像並連接它們。但是,ImageData構造函數中使用的Palette我無法弄清楚。SWT圖像連接或拼接/鑲嵌

我還搜索了SWT平鋪或馬賽克功能從一組圖像創建一個圖像,但什麼也沒找到。

任何想法如何可以有效地顯示數以千計的小圖像彼此相鄰?請注意,一旦顯示圖像,它們不會被操縱,所以這是一次性成本。

回答

2

您可以直接在新(大)圖像的GC(圖形上下文)上繪圖。有一個大的圖像應該得到比成千上萬更小的圖像資源的利用率要少得多(在SWT每個圖像保持一些操作系統的圖形對象句柄)

什麼你可以嘗試是這樣的:

 final List<Image> images; 
     final Image bigImage = new Image(Display.getCurrent(), combinedWidth, height); 
     final GC gc = new GC(bigImage); 
     //loop thru all the images while increasing x as necessary: 
     int x = 0; 
     int y = 0; 
     for (Image curImage : images) { 
      gc.drawImage(curImage, x, y); 
      x += curImage.getBounds().width; 
     } 
     //very important to dispose GC!!! 
        gc.dispose(); 
     //now you can use bigImage 
0

大概不是每個圖像在任何時候都可以在屏幕上看到嗎?也許更好的解決方案是隻在圖像變爲(或即將變爲)可見時加載圖像,當它們從屏幕上滾動出來時處理它們。顯然你想在當前視口的任一側保留一些內存,以便爲用戶平滑過渡。

+0

將如何檢測當一個圖像滾動屏幕? – 2009-05-29 13:32:10

0

我以前使用Java應用程序來創建photomosaics,並發現使用java映像(JAI)庫和SWT實現足夠的性能和內存使用非常困難。儘管我們沒有使用幾乎所有的圖像,但有一條路線是依賴於java之外的實用程序。特別是,您可以使用ImageMagick命令行實用工具將拼接圖拼接在一起,並從磁盤加載完成的內存。如果你想要看起來,還有一個ImageMagick的C++ API,它在內存中非常有效。