我有一个Eclipse RCP应用程序,它可以显示很多(10k +)的小图像,就像电影胶片一样。对于每个图像,我使用的是SWT Image
对象。这会占用过多的内存和资源。我正在寻找一种更有效的方式。我想通过创建一个ImageData
对象来获取所有这些图像并将它们连接起来,这个对象具有适当的总宽度,连续宽度(具有恒定高度),并且对其余像素使用setPixel()
。但是,Palette
构造函数中使用的ImageData
我无法弄清楚。
我还搜索了SWT平铺或马赛克功能,以便从一组图像中创建一个图像,但一无所获。
任何想法如何有效地展示数千张小图像?请注意,一旦显示图像,它们就不会被操纵,因此这是一次性费用。
答案 0 :(得分:2)
您可以直接在新(大)图像的GC(图形上下文)上绘图。拥有一个大图像应该导致比数千个较小图像少得多的资源使用(SWT中的每个图像都保持一些OS图形对象处理)
你可以尝试的是这样的:
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
答案 1 :(得分:0)
据推测,在任何时候屏幕上都不会显示每张图片?也许更好的解决方案是仅在图像变为(或即将变得)可见时加载图像,当它们从屏幕滚动时处理它们。显然,您希望在当前视口的任一侧保留一些内存,以便为用户进行平滑过渡。
答案 2 :(得分:0)
我以前使用Java应用程序创建了photomosaics,并发现使用java imaging(JAI)库和SWT很难实现足够的性能和内存使用。虽然我们没有使用你提到的几乎同样多的图像,但是一条路线依赖于java之外的实用程序。特别是,您可以使用ImageMagick命令行实用程序将拼接拼接在一起,并从磁盘加载完成的内存。如果你想获得幻想,还有一个用于ImageMagick的C ++ API,它在内存中非常有效。