我有一个Eclipse RCP应用程序,它可以显示很多(10k +)的小图像,就像电影胶片一样。对于每个图像,我使用的是SWT Image 对象。这会占用过多的内存和资源。我正在寻找一种更有效的方式。我想通过创建一个适当的总连接宽度(具有恒定高度)的 ImageData 对象并使用 setPixel()来获取所有这些图像并连接它们。剩下的像素。但是, ImageData 构造函数中使用的 Palette 我无法弄清楚。

我还搜索了SWT平铺或马赛克功能,以便从一组图像中创建一个图像,但一无所获。

任何想法如何有效地展示数千张小图像?请注意,一旦显示图像,它们就不会被操纵,因此这是一次性费用。

有帮助吗?

解决方案

您可以直接在新(大)图像的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

其他提示

据推测,在任何时候屏幕上都不会显示每张图片?也许更好的解决方案是仅在图像变为(或即将变得)可见时加载图像,当它们从屏幕滚动时处理它们。显然,您希望在当前视口的任一侧保留一些内存,以便为用户进行平滑过渡。

我以前使用Java应用程序创建了photomosaics,并发现使用java imaging(JAI)库和SWT很难实现足够的性能和内存使用。虽然我们没有使用你提到的几乎同样多的图像,但是一条路线依赖于java之外的实用程序。特别是,您可以使用ImageMagick命令行实用程序将拼接拼接在一起,并从磁盘加载完成的内存。如果你想获得幻想,还有一个用于ImageMagick的C ++ API,它在内存中非常有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top