我正在尝试将位图图像旋转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);
答案 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)
检查绘制位图的画布大小,也许你的画布仍然是风景,所以只能看到旋转位图的方形部分。