SWT画像の連結またはタイリング/モザイク
-
07-07-2019 - |
質問
私は、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もあります。これはメモリで非常に効率的です。