2011-12-22 19 views
17

Estoy tratando de rotar una imagen de mapa de bits 90 grados para cambiarla de un formato horizontal a un formato de retrato. Ejemplo:Android gira mapa de bits 90 grados resultados en imagen aplastada. Necesita una verdadera rotación entre vertical y horizontal

[a, b, c, d]
[e, f, g, h]
[i, j, k, l]

girado 90 grados hacia la derecha se convierte

[i, e, a]
[j, f, b]
[k, g, c]
[l, h, d]

con el siguiente código (de un ejemplo de línea) la imagen se gira 90 grados pero retiene t él aparea la relación de aspecto para que termines con una imagen verticalmente aplastada. ¿Estoy haciendo algo mal? ¿Hay algún otro método que deba 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); 
+0

No estoy seguro si entiendo su pregunta correctamente. ¿Desea rotar el diseño de la pantalla cuando cambia la orientación? ¿O desea cambiar la configuración de la pantalla aunque la orientación no cambie? (¡Android gira automáticamente los elementos de la pantalla cuando cambia la orientación!) – Ahmed

+0

Así que quiero cambiar los datos del mapa de bits. En mi aplicación, la cámara está almacenando la imagen de forma incorrecta, de modo que incluso si se toma una fotografía en la orientación "retrato", todavía se carga en orientación "horizontal". Soy capaz de detectar la verdadera orientación a través de los datos EXIF ​​del archivo y quiero rotar el mapa de bits a la orientación correcta. No quiero simplemente cambiar cómo se muestra el mapa de bits, sino cambiar los datos reales para que luego de modificar la imagen pueda guardarse correctamente. – user999764

Respuesta

13

Así es como usted gire correctamente (esto asegura la 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; 
} 
+0

gracias Tolga, intentaré esto esta noche. – user999764

+0

no hay problema, cuando lo estaba buscando, lo hice de la forma en que lo tenía (probablemente utilicé el mismo ejemplo) finalmente se me ocurrió el código que publiqué para la rotación correcta –

+0

hmmm, está girando pero aún queda aplastado verticalmente. Lo mismo de antes. – user999764

41

Esto es todo lo que necesita para girar la imagen:

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

En su código muestra, incluiste una llamada a postScale. ¿Podría ser esa la razón por la que tu imagen se estira? Tal vez sacar ese y hacer algunas pruebas más.

+0

Si desea hacer una imagen girada con una altura superior a la original (como debe ser), verá una excepción 'java.lang.IllegalArgumentException: y + height debe ser <= bitmap.height()'. Por lo tanto, no hagas que el mapa de bits sea más grande que el original. – CoolMind

0

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); 
0

cheque el tamaño del lienzo donde se dibuja el mapa de bits, tal vez su lienzo es todavía paisaje, por lo que sólo la parte cuadrada del mapa de bits girado podría ser visto.

Cuestiones relacionadas