0

私は以前にこの質問をしましたが、いくつかのポイントを言い換え/明確にして、それを拡張したいと思いました。AffineTransformを使用してBufferedImageを変換するコードがあります。

op = new AffineTransformOp(atx, interactive ? interpolationInteractive : interpolationNormal);
displayImage = op.filter(displayImage, null);

このコードは正常に機能しますが、メモリが蓄積されます。具体的には、このコードが呼び出されるたびに、より多くのメモリが蓄積されます。他の形式のフィルターも試しました。

op = new AffineTransformOp(atx, interactive ? interpolationInteractive : interpolationNormal);
displayImage2 = op.createCompatibleDestImage(displayImage, displayImage.getColorModel());
op.filter(displayImage, displayImage2);

ただし、これは最初のバージョンよりもはるかに低速です。最初のバージョンの速度と2番目のバージョンのメモリ使用量が必要です。

  1. 最初のバージョンの後でクリーンアップするにはどうすればよいですか?具体的には、中間のBufferedImagesはどこに保存され、どのように削除できますか?
  2. 2番目のバージョンが最初のバージョンより遅いのはなぜですか?それをスピードアップするために私は何ができますか?

ご協力いただきありがとうございます!!!

4

2 に答える 2

0

OutOfMemoryErrorsが発生しない限り、これは正常なことであり、GCは適切と判断した場合はいつでも画像を収集するというコメントに同意します。これは私が懸念を持っていたときに時々行ったばかげたテストです:それをメイン関数のループに入れ、プロファイラーでメモリ使用量を監視します(ジグザグのようなパターンを作成する必要があります)が、常に完了することができるとは限りません正常に。

于 2009-12-03T18:36:09.017 に答える
0

どのように取得displayImageし、それは何ColorModelを使用していますか?

の場合、それはIndexColorModel多くのことを説明するかもしれません。

最初のコードフラグメントは、BufferedImageを使用してを返しDirectColorModelます。これには、ピクセルあたり4バイトが必要ですが、インデックス付き画像の場合は通常、ピクセルあたり1バイトが必要です。その1:4の拡張は、メモリ不足状態を引き起こしている可能性があります。

2番目のコードフラグメントはBufferedImage、ソースと同じモデルでを作成します。それがでIndexColorModelあり、補間がではないNEAREST_NEIGHBOR場合、filter()呼び出しは。を使用して一時的なものを作成しBufferedImageますDirectColorModel。これをフィルター操作の宛先として使用し、一時バッファーを再量子化して、に描画しますdisplayImage2。つまり、2倍のビットブリットです。

単一の変換のみを実行している場合は、2番目の形式を使用すると思います。

複数の操作を行う場合は、のペアに。を割り当てBufferedImageますDirectColorModel。最大の画像を保持するのに十分な大きさ。ソース画像をそれらの1つに描画し、それらの間でフィルターを実行します。次に、終了したら、を使用しColorConvertOpて再量子化してインデックス付き画像に戻します。そうすれば、フィルター呼び出しごとにではなく、一度だけ色変換する必要があります。

于 2009-12-03T21:20:19.560 に答える