2008-11-07 43 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,它在内存中非常有效。