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. ¿Hay 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, mostrarla en la pantalla como un mapa de bits. La única forma en que pude 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 esta es la forma correcta) de Bitmap a matriz de bytes, por lo que puedo usar un 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.
mImage.setImageBitmap(_result.getBitmap());
de mionTaskComplete()
devolución de llamada. Ahora tengo que permitir que los usuarios guarden el archivo localmente si lo desean a través del menú contextual de pulsación larga. Debería poder usar la solución a continuación. Sin embargo, lo que quiero saber, ¿descubriste un mejor enfoque para esto?Respuestas:
fuente
90
, en el ejemplo anterior, no tendrá ningún efecto al guardar como PNG, pero hará una diferencia para los JPEG. En el caso de un JPEG, puede elegir cualquier número entre 0 y 100.Debe usar 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 insertará en un OutputStream.Aquí hay un ejemplo de una instancia de mapa de bits obtenida a través de
getImageBitmap(myurl)
que se puede comprimir como JPEG con una tasa de compresión del 85%:fuente
fOut.flush()
¿no es posible omitirlo?Bitmap.compress
especifica calidad.getImageBitmap(myurl)
lanzará una excepción sin permiso en AndroidManifest.xml (al menos en os2.2):
fuente
Dentro
onActivityResult
:fuente
Algunos formatos, como PNG sin pérdida, ignorarán la configuración de calidad.
fuente
Aquí está el código de muestra para guardar el mapa de bits en el archivo:
Ahora llame a esta función para guardar el mapa de bits en la memoria interna.
File newfile = savebitmap(bitmap)
;Espero que te ayude. Feliz vida de codificación.
fuente
fuente
¿Por qué no llamar al
Bitmap.compress
método con 100 (que parece que no tiene pérdidas)?fuente
También me gustaría guardar una foto. Pero mi problema (?) Es que quiero guardarlo desde un mapa de bits que he dibujado.
Lo hice así:
fuente
La forma en que encontré para enviar PNG y transparencia.
fuente
Crea una miniatura de video para un video. Puede volver nulo si el video está dañado o el formato no es compatible.
Para guardar su mapa de bits en la tarjeta SD, use el siguiente código
Almacenar imagen
Para obtener la ruta para el almacenamiento de imágenes
fuente
Desea guardar el mapa de bits en el directorio de su elección. He creado una biblioteca ImageWorker que permite al usuario cargar, guardar y convertir imágenes de mapas de bits / dibujables / base64.
SDK mínimo: 14
Requisito previo
Guardar mapa de bits / Drawable / Base64
Cargando mapa de bits
Implementación
Agregar dependencias
En Project Level Gradle
En el nivel de aplicación Gradle
Puede leer más en https://github.com/ihimanshurawat/ImageWorker/blob/master/README.md
fuente
Oye, solo dale el nombre a .bmp
Hacer esto:
parecerá que IM ESTOY ENGAÑANDO ALREDEDOR, pero pruébalo una vez que se guarde en bmp foramt ... Cheers
fuente
Asegúrese de crear el directorio antes de llamar
bitmap.compress
:fuente
Después de Android 4.4 Kitkat, y a partir de 2017, la cuota de Android 4.4 y menos es aproximadamente del 20% y disminuye, no es posible guardar en la tarjeta SD usando la
File
clase y elgetExternalStorageDirectory()
método. Este método devuelve la memoria interna de su dispositivo y las imágenes guardadas visibles para cada aplicación. También puede guardar imágenes privadas en su aplicación y eliminarlas cuando el usuario elimina su aplicación conopenFileOutput()
método.A partir de Android 6.0, puede formatear su tarjeta SD como memoria interna pero solo privada para su dispositivo. (Si formatea el auto SD como memoria interna, solo su dispositivo puede acceder o ver su contenido) Puede guardar en esa tarjeta SD usando otras respuestas, pero si desea utilizar una tarjeta SD extraíble, debe leer mi respuesta a continuación.
Debería usar Storage Access Framework para obtener el
onActivityResult
método de actividad de uri a carpeta para obtener la carpeta seleccionada por el usuario, y agregar permiso persistente recuperable para poder acceder a la carpeta después de que el usuario reinicie el dispositivo.Ahora, guarde la carpeta de guardar en las preferencias compartidas para no pedirle al usuario que seleccione la carpeta cada vez que desee guardar una imagen.
Debe usar
DocumentFile
class para guardar su imagen, noFile
oParcelFileDescriptor
, para obtener más información, puede consultar este hilo para guardar la imagen en la tarjeta SD con elcompress(CompressFormat.JPEG, 100, out);
método y lasDocumentFile
clases.fuente
asegúrese de haber agregado a continuación el permiso
y en AndroidManifest bajo
luego simplemente llame a saveBitmapFile (passYourBitmapHere)
dónde
y otros métodos
y
fuente
error handling for PIE devices..
y supongo que la recursióngetOutputMediaFile
podría ser un bucle infinito si falla la solución?Guarde Bitmap en su galería sin comprimir.
fuente
// | == | Cree un archivo PNG desde un mapa de bits:
// | == | Obtener Bimap del archivo:
fuente