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, guárdela en la tarjeta SD en una carpeta determinada. ¿Hay una manera fácil de tomar un mapa de bits y sólo 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 manera que he podido encontrar para guardar una imagen en una carpeta determinada es usar FileOutputStream, pero eso requiere una matriz de bytes. No estoy seguro de cómo convertir (si esto es incluso la forma correcta) de Bitmap a la matriz de bytes, por lo que puede utilizar un FileOutputStream para escribir los datos.
- Bitmap demasiado grande para ser cargado en una textura
- Uso de la clase EffectFactory en mapa de bits - Android
- Android, ¿Cómo almacenar la imagen en almacenamiento interno?
- Lona de Android. Mover y girar mapa de bits a lo largo de la ruta circular basada en el tacto?
- ¿Hay una solución de reproducción de video más rápida que las funciones de AndroidBitmap_xxx?
La otra opción que tengo es usar MediaStore:
MediaStore.Images.Media.insertImage(getContentResolver(), bm, barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
Lo que funciona bien para guardar en la tarjeta SD, pero no le permite personalizar la carpeta.
- La aplicación se bloquea al escalar el mapa de bits en lienzo
- Android rotar mapa de bits sin hacer una copia
- Widget de la aplicación Android con renderizado personalizado
- Data.getExtras (). Get ("data") resultado de la imagen de baja resolución en android
- ¿Cómo adjuntar la imagen de drawable a gmail?
- Cómo guardar un mapa de bits en el almacenamiento interno
- Cómo hacer que el movimiento de caída de nieve para un mapa de bits en Android
- Android Native crash en /system/lib/libskia.so (procesamiento de mapas de bits)
FileOutputStream out = null; try { 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 (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } }
Debe utilizar el método Bitmap.compress()
para guardar un mapa de bits como un archivo. Se comprime (si el formato utilizado lo permite) su imagen y empujarlo en un OutputStream.
Aquí hay un ejemplo de una instancia Bitmap obtenida a través de 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"/>
Dentro 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(); }
Algunos formatos, como PNG que no tiene pérdidas, ignorarán el ajuste de calidad.
¿Por qué no llamar al método Bitmap.compress
con 100 (que suena como si no Bitmap.compress
pérdidas)?
Bitmap bbicon; bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10); //ByteArrayOutputStream baosicon = new ByteArrayOutputStream(); //bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon); //bicon=baosicon.toByteArray(); String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); OutputStream outStream = null; File file = new File(extStorageDirectory, "er.PNG"); try { outStream = new FileOutputStream(file); bbicon.compress(Bitmap.CompressFormat.PNG, 100, outStream); outStream.flush(); outStream.close(); } catch(Exception e) { }
También me gustaría guardar una imagen. Pero mi problema (?) Es que quiero guardarlo de un mapa de bits que ive dibujado.
Lo hice así:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.save_sign: myView.save(); break; } return false; } public void save() { String filename; Date date = new Date(0); SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss"); filename = sdf.format(date); try{ String path = Environment.getExternalStorageDirectory().toString(); OutputStream fOut = null; File file = new File(path, "/DCIM/Signatures/"+filename+".jpg"); fOut = new FileOutputStream(file); mBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); fOut.flush(); fOut.close(); MediaStore.Images.Media.insertImage(getContentResolver() ,file.getAbsolutePath(),file.getName(),file.getName()); }catch (Exception e) { e.printStackTrace(); } }
La manera que encontré para enviar PNG y la transparencia.
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CustomDir"; File dir = new File(file_path); if(!dir.exists()) dir.mkdirs(); String format = new SimpleDateFormat("yyyyMMddHHmmss", java.util.Locale.getDefault()).format(new Date()); File file = new File(dir, format + ".png"); FileOutputStream fOut; try { fOut = new FileOutputStream(file); yourbitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut); fOut.flush(); fOut.close(); } catch (Exception e) { e.printStackTrace(); } Uri uri = Uri.fromFile(file); Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(android.content.Intent.EXTRA_SUBJECT, ""); intent.putExtra(android.content.Intent.EXTRA_TEXT, ""); intent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(intent,"Sharing something")));
Aquí está el código de ejemplo para guardar el mapa de bits en el archivo:
public static File savebitmap(Bitmap bmp) throws IOException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 60, bytes); File f = new File(Environment.getExternalStorageDirectory() + File.separator + "testimage.jpg"); f.createNewFile(); FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); fo.close(); return f; }
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.
Hey, solo den el nombre a .bmp
Hacer esto:
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); _bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes); //you can create a new file name "test.BMP" in sdcard folder. File f = new File(Environment.getExternalStorageDirectory() + File.separator + "**test.bmp**")
Suena que IM JUST TOOLO ALREDEDOR, pero intente una vez que se salva en bmp foramt .. Cheers
Asegúrese de que el directorio se crea antes de llamar a bitmap.compress
:
new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
No es una respuesta, sino un comentario. Estoy en un Mac que ejecuta el entorno del emulador, y obtener una java.io.IOException: permiso denegado – error con este código:
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { Log.d("DEBUG", "onActivityResult called"); super.onActivityResult(requestCode, resultCode, imageReturnedIntent); if(requestCode == 0 && resultCode == RESULT_OK) { Log.d("DEBUG", "result is ok"); try{ Bitmap map = (Bitmap) imageReturnedIntent.getExtras().get("data"); File sd = new File(Environment.getExternalStorageDirectory(), "test.png"); sd.mkdirs(); sd.createNewFile(); FileOutputStream out = new FileOutputStream(sd); map.compress(Bitmap.CompressFormat.PNG, 90, out); out.flush(); out.close(); } catch(FileNotFoundException e){ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
También agregué los usos-permiso android.permission.WRITE_EXTERNAL_STORAGE al archivo de manifiesto (como lo señalaron otros).
// | == | Crear un archivo PNG desde Bitmap:
void devImjFylFnc(String pthAndFylTtlVar, Bitmap iptBmjVar) { try { FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar); iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar); fylBytWrtrVar.close(); } catch (Exception errVar) { errVar.printStackTrace(); } }
// | == | Obtener Bimap de archivo:
Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar) { return BitmapFactory.decodeFile(pthAndFylTtlVar); }
- Android 1.6: "android.view.WindowManager $ BadTokenException: No se puede agregar ventana-token null no es para una aplicación"
- ¿Alguien tiene puntos de referencia (código y resultados) que comparan el rendimiento de las aplicaciones de Android escritas en Xamarin C # y Java?