Android rotar el mapa de bits de 90 grados da como resultado una imagen aplastada. Necesita un verdadero giro entre el retrato y el paisaje.
bitmap rotation (4)
Estoy tratando de rotar una imagen de mapa de bits 90 grados para cambiarla de un formato de paisaje a un formato de retrato. Ejemplo:
[a B C D]
[e F G H]
[i, j, k, l]
girado 90 grados en el sentido de las agujas del reloj se convierte
[i, e, a]
[j, f, b]
[k, g, c]
[l, h, d]
Usando el código de abajo (de un ejemplo en línea), la imagen se gira 90 grados pero conserva la relación de aspecto del paisaje para que termines con una imagen aplastada verticalmente. ¿Estoy haciendo algo mal? ¿Hay otro método que necesito usar? También estoy dispuesto a rotar el archivo jpeg que estoy usando para crear el mapa de bits si es más fácil.
// 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);
Así es como lo rotaría correctamente (esto asegura una rotación adecuada de la imagen)
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;
}
Este código funcionó muy bien para mí:
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);
Esto es todo lo que necesitas para rotar la imagen:
Matrix matrix = new Matrix();
matrix.postRotate(90);
rotated = Bitmap.createBitmap(original, 0, 0,
original.getWidth(), original.getHeight(),
matrix, true);
En su ejemplo de código, incluyó una llamada a postScale. ¿Podría ser esa la razón por la que se estira tu imagen? Tal vez sacar eso y hacer algunas pruebas más.
verifique el tamaño del lienzo en el que dibuja el mapa de bits, tal vez su lienzo sea todavía horizontal, de modo que solo se pueda ver la parte cuadrada del mapa de bits girado.