質問

私は、Eclipse RCPアプリケーションを使用して、フィルムストリップのように多数(10k +)の小さな画像を並べて表示します。各画像に対して、SWT Image オブジェクトを使用しています。これは、過剰な量のメモリとリソースを使用します。もっと効率的な方法を探しています。これらのすべての画像を取得し、適切な合計の ImageData オブジェクトを作成して連結し、幅(一定の高さ)を連結し、 setPixel()を使用して残りのピクセル。ただし、 ImageData コンストラクターで使用される Palette はわかりません。

画像のグループから1つの画像を作成するためのSWTタイリングまたはモザイク機能も検索しましたが、何も見つかりませんでした。

何千もの小さな画像を効率的に並べて表示する方法はありますか?画像が表示されると、それらは操作されないため、これは1回限りの費用であることに注意してください。

役に立ちましたか?

解決

新しい(大きな)画像のGC(グラフィックコンテキスト)に直接描画できます。 1つの大きな画像があると、数千の小さな画像よりもはるかに少ないリソース使用量になります(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アプリケーションを使用してフォトモザイクを作成しましたが、Javaイメージング(JAI)ライブラリとSWTを使用して適切なパフォーマンスとメモリ使用量を達成することは非常に困難でした。言及したほど多くの画像を使用していませんでしたが、1つの方法は、java以外のユーティリティに依存することでした。特に、ImageMagickコマンドラインユーティリティを使用してモザイクをつなぎ合わせ、ディスクから完成したメモリをロードできます。おしゃれにしたい場合は、ImageMagick用のC ++ APIもあります。これはメモリで非常に効率的です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top