web-dev-qa-db-ja.com

Androidビットマップを90度回転すると、画像が押しつぶされます。縦向きと横向きの間で真の回転が必要です

ビットマップ画像を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); 
18
user999764

画像を回転させるために必要なのはこれだけです。

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

コードサンプルには、postScaleへの呼び出しが含まれています。それがあなたのイメージが引き伸ばされている理由でしょうか?おそらくそれを取り出して、さらにいくつかのテストを行います。

41
SharkAlley

これが適切に回転する方法です(これにより画像の適切な回転が保証されます)

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;
}
13
Tolga E

このコードは私にとってうまく機能しました:

                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
EyalBellisha

ビットマップを描画するキャンバスのサイズを確認してください。キャンバスがまだ横向きであるため、回転したビットマップの正方形の部分しか表示されない可能性があります。

0
Sun Zhengchang