2011-02-03 19 views
2

現在、当社の製品 "Intermedia Fotoficient"で画像操作を行うJava JAIメソッドを使用しています。私はダブル/クアッドコアCPU上で拡大するために複数のスレッドを使用する画像スケーリングアルゴリズムまたは実装を探しています。ネイティブアクセラレーションは大きなプラスになります。各コアに1つ - - と、各コアは、ちょうどこれらの領域のいずれかを再スケール有するように予めJavaマルチスレッド画像スケーリング

おかげ

答えて

2

一つのアイデアは、矩形領域に画像を破壊することであろう。範囲が重複していないため、ロックを一切行わずに範囲を指定することができます。

+0

アルゴリズム上に情報源があり、ソース画像タイルでも使用できますか? – Benjamin

5

これは、templatypypedefの提案に対する肯定(および追加)を意味します。これは確かなものです。

まず、複数のスレッドを使用してこれを行う必要があります.JVMとOSスケジューラは、必要に応じて複数のコアにネイティブスレッドを生成し、ロードバランスする方法を正確に決定します。あなたはこれを制御できません(詳細については、「java multi-core processor support」を参照してください)。

第2に、BufferedImage.getData(Rectangle)を使用して画像を切り取って処理するためにそのセクションを引き出すことが望ましいでしょう。

注:ほとんどの画像アルゴリズムでは、個々のピクセルの周りの領域を使用して、新しいスケールされた量がどのようなものになるかを知ることができます。したがって、切り抜いているセクションの内側のエッジに沿って注意を払います。必要以上のピクセルを追加して、スケーリングアルゴリズムにより正確なカラー値が得られます。

具体的には、処理のために画像の上端を切り取ったとします。したがって、寸法は0,0から始まり150,150となります。右のカットラインとボトムカットラインに沿って計算されたすべてのピクセル値は、より正確で、右または下のそれぞれに何もブレンドされていないので、160x160と言うように切り捨てたいと思うでしょう。

イメージを再アセンブルして、それらのスライスされたエッジに含まれていた "バッファ"スペースを捨てます。これ以上不要になるので、イメージスケーリングアルゴリズムと平均する。

この全体的な方法では、プロセッサに優しい方法で処理するには、画像あたり約3倍のメモリが必要になります(通常、このような種類のプロセッサに優しい方法があります)。

あなたが持っている:

  1. オリジナル画像の元画像データのスケーリング動作中
  2. の準々スライスコピー
  3. 4Xは、おそらくJVMがオンに保持される時間のポイントがありすべての4倍の1/4スライスのコピーと4倍の縮小版に適用されます。スケール操作が戻る前に、元の4つのスライスをフラッシュ/廃棄することができます。
  4. 再アセンブリの瞬間に、元のイメージはまだ残っています(それをフラッシュしない限り)か、4つの小さい四半期とフルサイズの再構成された縮尺のインスタンスがあります。

3倍のメモリ要件は、おおむね最悪の場合のシナリオですが、それに注意してください。

+0

これは非常に高品質の回答です、Riyadに感謝します。私はそれのプロトタイプを構築します。 –

関連する問題