3

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

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

有什么想法可以有效地并排显示数千张小图像吗?请注意,图像一旦显示,就不会被操纵,因此这是一次性费用。

4

3 回答 3

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
于 2008-11-14T18:07:28.443 回答
0

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

于 2008-11-13T16:45:20.107 回答
0

我以前使用 Java 应用程序创建照片马赛克,发现使用 Java 成像 (JAI) 库和 SWT 很难实现足够的性能和内存使用。尽管我们使用的图像几乎没有您提到的那么多,但一种方法是依赖 java 之外的实用程序。特别是,您可以使用 ImageMagick 命令行实用程序将您的马赛克拼接在一起,并从磁盘加载完成的内存。如果你想花哨的话,还有一个 ImageMagick 的 C++ API,它在内存方面非常高效。

于 2008-11-13T16:52:42.743 回答