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.

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.

 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); } 
  • FPS bajo con Android SurfaceView
  • Mezcla de píxeles de dos mapas de bits
  • Android - Excepción de memoria
  • ¿Por qué tanta memoria?
  • Android: Cómo obtener el ancho de escala de bitmap en onDraw ()
  • Cómo escalar mapas de bits en View.Canvas en Android?
  • Tamaño de imagen de mapa de bits de Android
  • Android - nuevo BitmapDrawable obsoleto; Alternativa Bitmap.createBitmap tiene que tener w / h> 0
  • Ancho / altura del mapa de bits diferente después de cargar desde Recurso
  • Tamaño del mapa de bits devuelto por la cámara a través de la intención?
  • Cómo crear ImageView redimensionable en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.