Guardar mapa de bits en la ubicación
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.
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();
}
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());
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"/>
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();
}