android image byte decoding

Byte de Android[] a la imagen en Camera.onPreviewFrame



decoding (4)

¡Esto ha sido difícil de encontrar! Pero desde API 8, hay una clase YuvImage en android.graphics. No es un descendiente de la imagen, así que todo lo que puedes hacer con él es guardarlo en Jpeg, pero puedes guardarlo en el flujo de memoria y luego cargarlo en la imagen de mapa de bits si eso es lo que necesitas.

import android.graphics.YuvImage; @Override public void onPreviewFrame(byte[] data, Camera camera) { try { Camera.Parameters parameters = camera.getParameters(); Size size = parameters.getPreviewSize(); YuvImage image = new YuvImage(data, parameters.getPreviewFormat(), size.width, size.height, null); File file = new File(Environment.getExternalStorageDirectory() .getPath() + "/out.jpg"); FileOutputStream filecon = new FileOutputStream(file); image.compressToJpeg( new Rect(0, 0, image.getWidth(), image.getHeight()), 90, filecon); } catch (FileNotFoundException e) { Toast toast = Toast .makeText(getBaseContext(), e.getMessage(), 1000); toast.show(); } }

Cuando intento convertir el byte[] de Camera.onPreviewFrame a Bitamp usando BitmapFactory.decodeByteArray un error SkImageDecoder::Factory returned null

Lo siguiente es mi código:

public void onPreviewFrame(byte[] data, Camera camera) { Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length); }


Desde Android 3.0, puede usar TextureView y TextureSurface para mostrar la cámara, y luego usar mTextureView.getBitmap() para recuperar un marco de vista previa RGB amigable.

Un ejemplo muy esquelético de cómo hacer esto se da en los documentos de TextureView . Tenga en cuenta que tendrá que configurar su aplicación o actividad para que sea acelerada por hardware al poner android:hardwareAccelerated="true" en el manifiesto.


Encontré la respuesta después de mucho tiempo. Aquí está...

En lugar de usar BitmapFactory , usé mi método personalizado para decodificar los datos de este byte[] data a un formato de imagen válido. Para decodificar la imagen a un formato de imagen válido, uno necesita saber qué formato de imagen está utilizando la cámara llamando a camera.getParameters().getPictureFormat() . Esto devuelve una constante definida por ImageFormat . Después de conocer el formato, use el codificador apropiado para codificar la imagen.

En mi caso, los byte[] data estaban en el formato YUV , así que busqué la conversión de YUV a BMP y eso resolvió mi problema.


puede intentar esto: este ejemplo envía marcos de cámara al servidor

@Override public void onPreviewFrame(byte[] data, Camera camera) { try { byte[] baos = convertYuvToJpeg(data, camera); StringBuilder dataBuilder = new StringBuilder(); dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT)); mSocket.emit("newFrame", dataBuilder.toString()); } catch (Exception e) { Log.d("########", "ERROR"); } } }; public byte[] convertYuvToJpeg(byte[] data, Camera camera) { YuvImage image = new YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int quality = 20; //set quality image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality return baos.toByteArray(); }