2012-03-11 11 views
9

He creado una aplicación que graba y guarda fotos. Tengo una vista previa y una superposición sobre esa vista previa. La superposición define un cuadrado (el área alrededor de la plaza muestra la vista previa de un poco más oscuro), como se puede ver en la imagen:Cámara Android: ¿cómo puedo tomar un "rectángulo" específico de la matriz de bytes?

example

lo que tengo que hacer es extraer la parte de la imagen donde está el cuadrado La plaza se define así:

Rect frame = new Rect(350,50,450,150); 

¿Cómo puedo hacer eso? Tengo la matriz de bytes (datos byte []) que puedo guardar, pero quiero cambiar la aplicación para que solo se guarde el área cuadrada.

Edición: He intentado lo siguiente:

int[] pixels = new int[100000]; 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); 
      bitmap.getPixels(pixels, 0, 480, 350, 50, 100, 100); 
      bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_4444); 
      bitmap.compress(CompressFormat.JPEG, 0, bos); 
      byte[] square = bos.toByteArray(); 

y luego escribir la matriz "cuadrada" a un nuevo archivo ... El problema es que me sale una imagen hecha de líneas ... hay es un problema con la transformación que hice

+0

solución sencilla epically ... http://stackoverflow.com/a/17733530/294884 – Fattie

+0

@Eyal Por lo que solo quiere recortar el área del rectángulo del byte [] sin guardarlo en el medio? – ashishdhiman2007

Respuesta

8

Me tomó un tiempo para darse cuenta de que el código debería tener este aspecto:

int[] pixels = new int[100*100];//the size of the array is the dimensions of the sub-photo 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); 
     bitmap.getPixels(pixels, 0, 100, 350, 50, 100, 100);//the stride value is (in my case) the width value 
     bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_8888);//ARGB_8888 is a good quality configuration 
     bitmap.compress(CompressFormat.JPEG, 100, bos);//100 is the best quality possibe 
     byte[] square = bos.toByteArray(); 
3

Los datos de vista previa de la cámara vienen en formato YUV (específicamente ImageFormat.NV21), que BitmapFactory no admite directamente. Puede usar YuvImage para convertirlo a un mapa de bits como se describe en here. La única diferencia es que querrá pasar un Rect correspondiente al cuadrado que desee cuando llame a YuvImage.compressToJpeg.

+0

Hola, gracias por la ayuda, he intentado usar YuvImage pero el resultado fue desordenado y después de la compresión obtuve una pantalla llena de puntos coloridos ... – Eyal

Cuestiones relacionadas