Android将位图旋转90度会导致压缩图像。需要在纵向和横向之间进行真正的旋转

时间:2011-12-22 19:20:58

标签: android bitmap rotation

我正在尝试将位图图像旋转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度但保留横向纵横比,因此您最终会得到一个垂直压扁的图像。难道我做错了什么?我需要使用另一种方法吗?我也愿意旋转我用来创建位图的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); 

4 个答案:

答案 0 :(得分:40)

这就是旋转图像所需的全部内容:

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

在您的代码示例中,您包含了对postScale的调用。这可能是你的图像被拉伸的原因吗?也许拿出那个并做更多的测试。

答案 1 :(得分: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;
}

答案 2 :(得分: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);

答案 3 :(得分:0)

检查绘制位图的画布大小,也许你的画布仍然是风景,所以只能看到旋转位图的方形部分。