ビットマップ画像を90度回転させて、横向きから縦向きに変更しようとしています。例:
[あいうえお]
[e、f、g、h]
[i、j、k、l]
時計回りに90度回転すると
[i、e、a]
[j、f、b]
[k、g、c]
[l、h、d]
以下のコード(オンラインの例から)を使用すると、画像は90度回転しますが、横向きのアスペクト比が保持されるため、垂直方向に押しつぶされた画像になります。私は何か間違ったことをしていますか?使用する必要がある別の方法はありますか?また、ビットマップの作成に使用しているjpegファイルが簡単であれば、回転させてもかまいません。
// 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);
画像を回転させるために必要なのはこれだけです。
Matrix matrix = new Matrix();
matrix.postRotate(90);
rotated = Bitmap.createBitmap(original, 0, 0,
original.getWidth(), original.getHeight(),
matrix, true);
コードサンプルには、postScaleへの呼び出しが含まれています。それがあなたのイメージが引き伸ばされている理由でしょうか?おそらくそれを取り出して、さらにいくつかのテストを行います。
これが適切に回転する方法です(これにより画像の適切な回転が保証されます)
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;
}
このコードは私にとってうまく機能しました:
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);
ビットマップを描画するキャンバスのサイズを確認してください。キャンバスがまだ横向きであるため、回転したビットマップの正方形の部分しか表示されない可能性があります。