Enregistrer le bitmap dans l’emplacement

Je travaille sur une fonction pour télécharger une image à partir d’un serveur Web, l’afficher à l’écran et si l’utilisateur souhaite conserver l’image, enregistrez-la sur la carte SD dans un dossier spécifique. Existe-t-il un moyen facile de prendre une bitmap et de simplement l’enregistrer sur la carte SD dans un dossier de mon choix?

Mon problème est que je peux télécharger l’image, l’afficher à l’écran en tant que bitmap. La seule façon dont j’ai pu trouver pour enregistrer une image dans un dossier particulier consiste à utiliser FileOutputStream, mais cela nécessite un tableau d’octets. Je ne sais pas comment convertir (si c’est même le bon sens) de Bitmap au tableau d’octets, afin que je puisse utiliser un FileOutputStream pour écrire les données.

L’autre option est d’utiliser MediaStore:

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

Ce qui fonctionne bien pour enregistrer sur la carte SD, mais ne vous permet pas de personnaliser le dossier.

     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(); } } 

    Vous devez utiliser la méthode Bitmap.compress() pour enregistrer un bitmap en tant que fichier. Il compressera (si le format le permet) votre image et la poussera dans un OutputStream.

    Voici un exemple d’instance Bitmap obtenue via getImageBitmap(myurl) et pouvant être compressée en JPEG avec un taux de compression de 85%:

     // Assume block needs to be inside a Try/Catch block. Ssortingng path = Environment.getExternalStorageDirectory().toSsortingng(); 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); 

    jettera exception sans permission dans AndroidManifest.xml (au moins dans os2.2):

      

    Inside onActivityResult :

     Ssortingng 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(); } 

    Certains formats, comme le format PNG sans perte, ignorent le paramètre de qualité.

    Pourquoi ne pas appeler la méthode Bitmap.compress avec 100 (ce qui semble être sans perte)?

     Bitmap bbicon; bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10); //ByteArrayOutputStream baosicon = new ByteArrayOutputStream(); //bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon); //bicon=baosicon.toByteArray(); Ssortingng extStorageDirectory = Environment.getExternalStorageDirectory().toSsortingng(); 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) { } 

    Voici l’exemple de code pour enregistrer un bitmap dans un fichier:

     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; } 

    Appelez maintenant cette fonction pour enregistrer le bitmap dans la mémoire interne.

    File newfile = savebitmap(bitmap) ;

    J’espère que cela vous aidera. Bonne vie de codage.

    Je voudrais aussi enregistrer une photo. Mais mon problème (?) Est que je veux l’enregistrer dans un bitmap que j’ai dessiné.

    Je l’ai fait comme ça:

      @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.save_sign: myView.save(); break; } return false; } public void save() { Ssortingng filename; Date date = new Date(0); SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss"); filename = sdf.format(date); try{ Ssortingng path = Environment.getExternalStorageDirectory().toSsortingng(); 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 façon dont j’ai trouvé pour envoyer le PNG et la transparence.

     Ssortingng file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CustomDir"; File dir = new File(file_path); if(!dir.exists()) dir.mkdirs(); Ssortingng 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"))); 

    Hey donne juste le nom à .bmp

    Faites ceci:

     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**") 

    ça va sonner que je vais juste me balader mais essayez-le une fois qu’il sera sauvé dans bmp foramt..Cheers

    Créez une miniature de vidéo pour une vidéo. Il peut retourner null si la vidéo est corrompue ou si le format n’est pas pris en charge.

     private void makeVideoPreview() { Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND); saveImage(thumbnail); } 

    Pour enregistrer votre bitmap dans sdcard, utilisez le code suivant

    Stocker l’image

     private void storeImage(Bitmap image) { File pictureFile = getOutputMediaFile(); if (pictureFile == null) { Log.d(TAG, "Error creating media file, check storage permissions: ");// e.getMessage()); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); image.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.close(); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: " + e.getMessage()); } catch (IOException e) { Log.d(TAG, "Error accessing file: " + e.getMessage()); } } 

    Pour obtenir le chemin du stockage d’images

     /** Create a File for saving an image or video */ private File getOutputMediaFile(){ // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/Android/data/" + getApplicationContext().getPackageName() + "/Files"); // This location works best if you want the created images to be shared // between applications and persist after your app has been uninstalled. // Create the storage directory if it does not exist if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ return null; } } // Create a media file name Ssortingng timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date()); File mediaFile; Ssortingng mImageName="MI_"+ timeStamp +".jpg"; mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); return mediaFile; } 

    Assurez-vous que le répertoire est créé avant d’appeler bitmap.compress :

     new File(FileName.subssortingng(0,FileName.lastIndexOf("/"))).mkdirs(); 

    Pas vraiment une réponse, mais un commentaire. Je suis sur un Mac exécutant l’environnement de l’émulateur et obtenez une exception java.io.IOException: Permission denied – erreur avec ce code:

     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(); } } } 

    J’ai également ajouté la permissions-use android.permission.WRITE_EXTERNAL_STORAGE au fichier manifeste (comme noté par d’autres).

    // | == | Créez un fichier PNG à partir de bitmap:

     void devImjFylFnc(Ssortingng pthAndFylTtlVar, Bitmap iptBmjVar) { try { FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar); iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar); fylBytWrtrVar.close(); } catch (Exception errVar) { errVar.printStackTrace(); } } 

    // | == | Obtenir Bimap à partir du fichier:

     Bitmap getBmjFrmFylFnc(Ssortingng pthAndFylTtlVar) { return BitmapFactory.decodeFile(pthAndFylTtlVar); } 

    Après Android 4.4 Kitkat, et à partir de 2017, la part d’Android 4.4 et moins est d’environ 20% et diminue, il n’est pas possible d’enregistrer sur la carte SD en utilisant la méthode File class et getExternalStorageDirectory() . Cette méthode renvoie la mémoire interne de votre appareil et les images sont visibles dans chaque application. Vous pouvez également enregistrer des images uniquement privées dans votre application et les supprimer lorsque l’utilisateur supprime votre application avec la méthode openFileOutput() .

    À partir d’Android 6.0, vous pouvez formater votre carte SD en mémoire interne mais uniquement privée sur votre appareil (si vous formatez votre voiture SD en mémoire interne, seul votre appareil peut accéder ou voir son contenu). Vous pouvez enregistrer sur cette carte SD en utilisant autres réponses, mais si vous souhaitez utiliser une carte SD amovible, vous devriez lire ma réponse ci-dessous.

    Vous devez utiliser Storage Access Framework pour obtenir uri dans le dossier onActivityResult méthode d’activité pour obtenir le dossier sélectionné par l’utilisateur et append une autorisation persistante afin de pouvoir accéder au dossier après que l’utilisateur redémarre le périphérique.

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { // selectDirectory() invoked if (requestCode == REQUEST_FOLDER_ACCESS) { if (data.getData() != null) { Uri treeUri = data.getData(); tvSAF.setText("Dir: " + data.getData().toSsortingng()); currentFolder = treeUri.toSsortingng(); saveCurrentFolderToPrefs(); // grantUriPermission(getPackageName(), treeUri, // Intent.FLAG_GRANT_READ_URI_PERMISSION | // Intent.FLAG_GRANT_WRITE_URI_PERMISSION); final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getContentResolver().takePersistableUriPermission(treeUri, takeFlags); } } } } 

    Maintenant, enregistrez le dossier de sauvegarde dans les préférences partagées pour ne pas demander à l’utilisateur de sélectionner le dossier chaque fois que vous souhaitez enregistrer une image.

    Vous devez utiliser la classe DocumentFile pour enregistrer votre image, pas File ou ParcelFileDescriptor , pour plus d’informations, vous pouvez vérifier ce thread pour enregistrer l’image sur la carte SD avec compress(CompressFormat.JPEG, 100, out); méthodes et classes DocumentFile .