studio - Android/Java: guardar una matriz de bytes en un archivo(.jpeg)
camera 2 android studio (2)
Todo lo que necesito hacer es guardar la matriz de bytes en un archivo de imagen .jpeg.
Solo escríbelo en un archivo. Ya está en formato JPEG. Aquí hay una aplicación de ejemplo que demuestra esto . Aquí está la pieza clave de código:
class SavePhotoTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... jpeg) {
File photo=new File(Environment.getExternalStorageDirectory(), "photo.jpg");
if (photo.exists()) {
photo.delete();
}
try {
FileOutputStream fos=new FileOutputStream(photo.getPath());
fos.write(jpeg[0]);
fos.close();
}
catch (java.io.IOException e) {
Log.e("PictureDemo", "Exception in photoCallback", e);
}
return(null);
}
}
Estoy desarrollando una aplicación para Android, y parte de la aplicación tiene que tomar fotografías y guardarlas en la tarjeta SD. El método onPictureTaken devolvió una matriz de bytes con los datos de la imagen capturada.
Todo lo que necesito hacer es guardar la matriz de bytes en un archivo de imagen .jpeg. He intentado hacer esto con la ayuda de BitmapFactory.decodeByteArray (para obtener un Bitmap) y luego bImage.compress (a un OutputStream), un OutputStream simple y un BufferedOutputStream. Los tres de estos métodos parecen darme el mismo error extraño. Mi teléfono con Android (cámara de 8 MP y un procesador decente) parece guardar la foto (el tamaño parece correcto), pero de forma corrupta (la imagen se corta y se desplaza cada sector; o simplemente obtengo líneas horizontales de varios colores) ; y lo extraño es que una tableta de Android con una cámara de 5MP y un procesador rápido parece guardar la imagen correctamente.
Así que pensé que tal vez el procesador no puede guardar imágenes grandes, porque obtuve Excepciones de OutOfMemory después de aproximadamente 3 imágenes (incluso con una calidad de compresión de 40). Pero entonces, ¿cómo lo hace la aplicación incorporada de la cámara, y mucho más rápido también? Estoy bastante seguro (de depuración) de que OutputStream escribe todos los datos (bytes) y debería estar bien, pero aún está dañado.
*** En resumen, ¿cuál es la forma mejor / más rápida (que funciona) de guardar una matriz de bytes en un archivo jpeg?
Gracias de antemano, Mark
Código que he probado (y algunas otras ligeras variaciones):
try {
Bitmap image = BitmapFactory.decodeByteArray(args, 0, args.length);
OutputStream fOut = new FileOutputStream(externalStorageFile);
long time = System.currentTimeMillis();
image.compress(Bitmap.CompressFormat.JPEG,
jpegQuality, fOut);
System.out.println(System.currentTimeMillis() - time);
fOut.flush();
fOut.close();
} catch (Exception e) {
}
y
try {
externalStorageFile.createNewFile();
FileOutputStream fos = new FileOutputStream(externalStorageFile);
fos.write(args);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
Este Código es perfecto para guardar imágenes en el almacenamiento, desde byte [] ... tenga en cuenta que "imagen" aquí es byte [] .... tomada como "byte [] image" como parámetro en una función.
File photo=new File(Environment.getExternalStorageDirectory(), "photo.jpg");
if (photo.exists()) {
photo.delete();
}
try {
FileOutputStream fos=new FileOutputStream(photo.getPath());
Toast.makeText(this, photo.getPath(), Toast.LENGTH_SHORT).show();
fos.write(image);
fos.close();
}
catch (java.io.IOException e) {
Log.e("PictureDemo", "Exception in photoCallback", e);
}
}