2011-12-22 9 views
17

ビットマップ画像を90度回転させて、風景フォーマットから肖像画フォーマットに変更しようとしています。例:Androidのビットマップを90度回転すると画像が潰れます。肖像画と風景の間で真の回転が必要です

[A、B、C、D]
[E、F、G、H]
[I、J、K、L]

は90度時計回りに

なる回転しました[I、E、A]
[J、F、B]
[K、G、C](オンラインの例から)以下のコードを使用し
[L、H、D]

画像90度回転しているが、t彼は縦横比を変えるので、垂直に潰れた画像になります。私は何か間違っているのですか?私は使用する必要がある別の方法がありますか?私はビットマップを作成するために使用しているjpegファイルを回転させても簡単です。あなたのコードでは

Matrix matrix = new Matrix(); 
matrix.postRotate(90); 
rotated = Bitmap.createBitmap(original, 0, 0, 
           original.getWidth(), original.getHeight(), 
           matrix, true); 

:ここ

// create a matrix for the manipulation 
Matrix matrix = new Matrix(); 
// resize the bit map 
matrix.postScale(scaleWidth, scaleHeight); 
// rotate the Bitmap 
matrix.postRotate(90); 

// recreate the new Bitmap 
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOriginal, 0, 0, widthOriginal, heightOriginal, matrix, true); 
+0

質問が正しく理解されているかどうかわかりません。向きが変わったときに画面レイアウトを回転しますか?または、向きが変わっていなくても画面レイアウトを変更したいですか? (向きが変わるとAndroidは自動的に画面要素を回転させます!) – Ahmed

+0

したがって、ビットマップデータ自体を変更したいと思います。私のアプリでは、カメラが写真を不適切に格納しているため、写真が「ポートレート」の向きで撮影されても、それが「横向き」の向きで読み込まれます。私はファイルのEXIFデータを介して真の方向を検出することができ、私は適切な方向にビットマップを回転させたい。ビットマップの表示方法を変更するだけではなく、実際のデータを変更して、イメージを変更した後に適切に保存できるようにしたいと思います。 – user999764

答えて

13

は、あなたがそれを正しく回転させるだろうかだ

public static Bitmap rotate(Bitmap b, int degrees) { 
    if (degrees != 0 && b != null) { 
     Matrix m = new Matrix(); 

     m.setRotate(degrees, (float) b.getWidth()/2, (float) b.getHeight()/2); 
     try { 
      Bitmap b2 = Bitmap.createBitmap(
        b, 0, 0, b.getWidth(), b.getHeight(), m, true); 
      if (b != b2) { 
       b.recycle(); 
       b = b2; 
      } 
     } catch (OutOfMemoryError ex) { 
      throw ex; 
     } 
    } 
    return b; 
} 
+0

Tolgaありがとう、私は今夜これを試してみます。 – user999764

+0

私はそれを見ていたときに、私はあなたがそれを持っていたように(おそらく同じ例を使用した)最終的に正しい回転のために投稿したコードを思い付いた –

+0

hmmm、それは回転していますが、これまでと同じです。 – user999764

41

これは、あなたが画像を回転させるために必要なすべてのです(これは画像の適切な回転を保証します)サンプルには、postScaleの呼び出しが含まれています。それがあなたのイメージが引き伸ばされている理由かもしれませんか?おそらくそれを取って、もう少しテストをしてください。

+0

高さが元のサイズよりも大きい回転イメージを作成したい場合は、例外java.lang.IllegalArgumentExceptionがあります。y + heightは<= bitmap.height()でなければなりません。だから、オリジナルよりもビットマップを大きくしないでください。 – CoolMind

0

このコードは、私のために素晴らしい仕事:

   Matrix matrix = new Matrix(); 

      matrix.setRotate(90, 0, 0); 
      matrix.postTranslate(original.getHeight(), 0); 

      rotatedBitmap = Bitmap.createBitmap(newWidth, newHeight, original.getConfig()); 
      Canvas tmpCanvas = new Canvas(rotatedBitmap); 
      tmpCanvas.drawBitmap(original, matrix, null); 
      tmpCanvas.setBitmap(null); 
0

はあなたがビットマップを描画キャンバスのサイズを確認し、多分あなたのキャンバスが回転し、ビットマップのように唯一の正方形の部分を見ることができる、まだ風景です。

関連する問題