2012-03-07 26 views
9

Acabo de terminar la actividad de mi cámara y está guardando maravillosamente los datos. ¿Qué hago después de tomar la fotografía:Android Girar imagen antes de guardar

protected void savePictureData() { 
    try { 
     FileOutputStream fs = new FileOutputStream(this.photo); 
     fs.write(this.lastCamData); 
     fs.close(); //okay, wonderful! file is just written to the sdcard 

     //--------------------- 
     //--------------------- 
     //TODO in here: dont save just the file but ROTATE the image and then save it! 
     //--------------------- 
     //--------------------- 


     Intent data = new Intent(); //just a simple intent returning some data... 
     data.putExtra("picture_name", this.fname); 
     data.putExtra("byte_data", this.lastCamData); 
     this.setResult(SAVED_TOOK_PICTURE, data); 
     this.finish(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     this.IOError(); 
    } 

} 

Lo que quiero es ya como comentario dada en el código de seguridad. No quiero que la imagen solo se guarde en un archivo, sino que se rotará y luego se guardará. ¡Gracias!

// EDITAR: De lo que estoy actualmente hasta (Obras, pero aún se encuentra con problemas de memoria con imágenes grandes)

byte[] pictureBytes; 
Bitmap thePicture = BitmapFactory.decodeByteArray(this.lastCamData, 0, this.lastCamData.length); 
Matrix m = new Matrix(); 
m.postRotate(90); 
thePicture = Bitmap.createBitmap(thePicture, 0, 0, thePicture.getWidth(), thePicture.getHeight(), m, true); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
thePicture.compress(CompressFormat.JPEG, 100, bos); 
pictureBytes = bos.toByteArray(); 

FileOutputStream fs = new FileOutputStream(this.photo); 
fs.write(pictureBytes); 
fs.close(); 
Intent data = new Intent(); 
data.putExtra("picture_name", this.fname); 
data.putExtra("byte_data", pictureBytes); 
this.setResult(SAVED_TOOK_PICTURE, data); 
this.finish(); 
+0

posible duplicado de [Android: Cómo rotar un mapa de bits en un punto central] (http://stackoverflow.com/questions/4166917/android-how-to-rotate-a-bitmap-on-a -center-point) – slayton

+0

nah, no realmente, es más acerca de cómo rotar y guardar después – androidavid

+0

bien mi solución parece funcionar - limpié el proyecto ... – androidavid

Respuesta

4

Antes de crear su FileOutputStream puede crear un nuevo Bitmap del original que se ha transformado utilizando un Matrix. Para ello se usaría este método:

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

Cuando el m define una matriz que es una transposición de su mapa de bits original.

Para ver un ejemplo sobre cómo hacer esto vistazo a esta pregunta: Android: How to rotate a bitmap on a center point

+0

hey, échale un vistazo a mi edición. Lo intenté, pero no funciona así ...:/ – androidavid

+0

Estoy intentando algo así. Pero cada vez que copio el mapa de bits obtuve una excepción: falta memoria ... –

+0

@JoubertVasconcelos, entonces necesita reducir la escala de la imagen. – slayton

17

Usted sólo puede leer la ruta desde la tarjeta SD y no el siguiente código ... se va a reemplazar la foto existente después de girar ..

Nota: Exif no funciona en la mayoría de los dispositivos, da los datos incorrectos por lo que es bueno codificar la rotación antes de guardar en cualquier grado que desee, solo tiene que cambiar el valor del ángulo en postRotate para cualquiera que quieras

String photopath = tempphoto.getPath().toString(); 
    Bitmap bmp = BitmapFactory.decodeFile(photopath); 

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

    FileOutputStream fOut; 
    try { 
     fOut = new FileOutputStream(tempphoto); 
     bmp.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
     fOut.flush(); 
     fOut.close(); 

    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
+0

Esto funcionó para mí. Gracias. – BRS

+0

¡El gran jefe también trabajó para mí! –

+0

¡El problema que tenemos los programadores con las fotos proviene de la clase de mapa de bits! Siempre, pasa la imagen para la clase de mapa de bits, esta gira la foto a 90 grados. Entonces la solución es que siempre que usemos una clase de mapa de bits y que tengamos que mostrar la foto, necesitamos aplicar 'matrix.postRotate (90);' para crear un mapa de bits rotado. –