Guardar mapa de bits en la ubicación

Resuelto Chrispix asked hace 54 años • 19 respuestas

Estoy trabajando en una función para descargar una imagen de un servidor web, mostrarla en la pantalla y, si el usuario desea conservar la imagen, guardarla en la tarjeta SD en una carpeta determinada. ¿Existe una manera fácil de tomar un mapa de bits y simplemente guardarlo en la tarjeta SD en una carpeta de mi elección?

Mi problema es que puedo descargar la imagen y mostrarla en la pantalla como un mapa de bits. La única forma que he podido encontrar para guardar una imagen en una carpeta en particular es usar FileOutputStream, pero eso requiere una matriz de bytes. No estoy seguro de cómo convertir (si es que esta es la forma correcta) de mapa de bits a matriz de bytes, así que puedo usar FileOutputStream para escribir los datos.

La otra opción que tengo es usar MediaStore:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");

Lo cual funciona bien para guardar en la tarjeta SD, pero no le permite personalizar la carpeta.

Chrispix avatar Jan 01 '70 08:01 Chrispix
Aceptado
try (FileOutputStream out = new FileOutputStream(filename)) {
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
    e.printStackTrace();
}
Ulrich Scheller avatar Mar 23 '2009 11:03 Ulrich Scheller

Debe utilizar el Bitmap.compress()método para guardar un mapa de bits como un archivo. Comprimirá (si el formato utilizado lo permite) su imagen y la enviará a un OutputStream.

A continuación se muestra un ejemplo de una instancia de mapa de bits obtenida getImageBitmap(myurl)que se puede comprimir como JPEG con una tasa de compresión del 85%:

// Assume block needs to be inside a Try/Catch block.
String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
Integer counter = 0;
File file = new File(path, "FitnessGirl"+counter+".jpg"); // the File to save , append increasing numeric counter to prevent files from getting overwritten.
fOut = new FileOutputStream(file);

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate
fOut.flush(); // Not really required
fOut.close(); // do not forget to close the stream

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
JoaquinG avatar Jun 10 '2010 10:06 JoaquinG
outStream = new FileOutputStream(file);

lanzará una excepción sin permiso en AndroidManifest.xml (al menos en os2.2):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
user996042 avatar Oct 14 '2011 22:10 user996042

Adentro onActivityResult:

String filename = "pippo.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

Bitmap bitmap = (Bitmap)data.getExtras().get("data");
try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}
Alessandro avatar Jan 25 '2012 16:01 Alessandro