19

画像をある程度回転させるアルゴリズム(入力)を探しています。

public Image rotateImage(Image image, int degrees)

(画像インスタンスは、各ピクセルのRGB値を含むint []に置き換えることができます。私の問題は、JavaME MIDP 2.0プロジェクトに実装する必要があるため、バージョン1.5より前のJVMで実行可能なコードを使用する必要があることです。 ?

編集:SVG APIを利用できないこと、および90〜180〜270以外の任意の角度で回転するメソッドが必要であることを忘れました

また、MIDP2.0ではjava.awt。*パッケージは利用できません。

4

4 に答える 4

25

私がインターネットで見つけた画像回転アルゴリズムを説明する最高のページの1つは、DanBloombergの優れたレプトニカライブラリに関連付けられています。レプトニカライブラリ自体はCで記述されており、役に立ちませんが、画像回転アルゴリズムに関する彼のページは次のとおりです。

http://www.leptonica.org/rotation.html

間違いなく読む価値があります。彼がページの2番目の部分で説明している、エリアマッピングによる回転アルゴリズムのようなものを実装することをお勧めします。

于 2009-01-27T18:33:16.707 に答える
7

一般的な解決策:宛先イメージの各ピクセルに対して、反対方向に回転した宛先ピクセルの座標を持つソース イメージのピクセルを取得します。

ソリューションの強化:通常、回転では正確なピクセル座標が得られません。オーバーラップするパーセンテージに従って、ソース ピクセルとその隣接ピクセルの加重平均を実行します。

バイナリ イメージのより高速なソリューション:イメージを連続する前景ピクセルの「実行」に変換します。次に、これらの線の端点を回転させて、目的地に引き込みます。

通常、これは整数の丸めによりわずかなギャップが生じるため、端点の一方または両方が整数から 10% 以上離れている場合は、整数座標の切り上げと切り下げを使用して、1 つのソース行に対して 2 つの行を描画してパッチを適用します。

一方の端点が 10% 以内で、もう一方がそうでない場合、2 つの線は「V」字型になります。両方が 10% 以上ずれている場合、2 本の線は「X」の形になります。

これは、X 軸または Y 軸に対して行うことができます。軸と回転角のなす角度が最も小さいものを使用してください。(つまり、回転角度が 45 から -45 の間の場合は、X 軸を使用します。)

バイナリ イメージのさらに高速なソリューション:前景ピクセルよりも背景ピクセルが少ない場合は、目的地を前景で塗りつぶし、背景ピクセルで上記のアルゴリズムに従います。

于 2009-02-24T22:00:19.367 に答える
-3

Graphics2DとAffineTransformは、あなたが望むことを正確に行うのに役立ちます。具体的には、Graphics2D.drawImage(Image、AffineTransform)およびAffineTransform.getRotateInstanceです。これを使用して、スケーリング、平行移動、およびせん断を行うこともできます。両方のクラスは、少なくとも1.4より前から、実行時に実行されています。

于 2009-01-27T18:26:14.177 に答える
-3
  public Image rotateImage(Image img, float degrees){
   BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB);
   sourceBI.getGraphics().drawImage(img,0,0,null);
   AffineTransform at = new AffineTransform();
   at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2);
   BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
   return bio.filter(sourceBI, null);
  }
于 2010-05-15T14:47:18.483 に答える