4

Java で画像のモザイクを作成しようとしています。作成する新しい画像のサイズを計算し、モザイクの一部となる各サブ画像に対して、ペイント コールを実行します。

擬似コード:

create buffered image big enough to hold entire mosaic
create Graphics2D context from that image

for each buffered subimage that will be a part of the mosaic
   draw the subimage on the graphics context of big bufferedimage
   g2.drawImage(myImage, x,y,width,height,null,null)

これを行うより良い方法はありますか?サブイメージをより大きなイメージに変換またはスケーリングしたくないので、何らかの直接コピー操作が利用できることを願っています。各サブイメージのラスターの配列コピーに似たもの。Raster オブジェクトを受け取る setData メソッドがあることに気付きましたが、このメソッドは、Raster が同じ座標空間にある必要があることを示しています。

何かご意見は?これは私のプログラムのボトルネックであり、できるだけ高速にしたいと考えています。

編集:ボトルネックがどこにあるかについて、私が間違っていたことがわかりました(確かなデータなしで仮定が行われる場合によくあることです)。メモリにキャッシュされた画像の縮小版を使用するのではなく、複数の 3MB の画像が何度も何度も読み取られるというバグがありました。修正すると、実行時間が 50 分から 15 秒になりました。

4

2 に答える 2

3

通常、drawImage() 呼び出しは、ハードウェア アクセラレーションによるブリット操作に直接マップされます。使用しているドライバー/グラフィック カードと JVM によっては、スケーリングもハードウェア アクセラレーションを使用する必要があります。ただし、スケーリングを回避できる場合は、もちろんそうする必要があります。

サブイメージが大きなイメージに収まる場合は、サブイメージの幅と高さと同じになるように幅と高さを選択することで、スケーリングを回避できるはずです。もちろん、この場合は g.drawImage(画像 img、int x、int y、ImageObserver オブザーバー)。

于 2010-07-04T21:08:53.673 に答える
-1

あなたは呼び出すことができます

getPixels(int x, int y, int w, int h, int[] iArray)

サブイメージのラスターで

setPixels(int x, int y, int w, int h, int[] iArray)

より大きな画像の WritableRaster で。ただし、効率やパフォーマンスについてはわかりません。自分でテストする必要があります。もちろん、画像は同じタイプ(同じ色空間、同じ解像度など)である必要がありますが、すでにそれを想定しているようです。

于 2010-07-04T19:09:21.000 に答える