Save bitmap to location

前端 未结 19 2399
悲哀的现实
悲哀的现实 2020-11-22 00:20

I am working on a function to download an image from a web server, display it on the screen, and if the user wishes to keep the image, save it on the SD card in a certain fo

相关标签:
19条回答
  • 2020-11-22 00:59

    // |==| Create a PNG File from 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(); }
    }
    

    // |==| Get Bimap from File :

    Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
    {
        return BitmapFactory.decodeFile(pthAndFylTtlVar);
    }
    
    0 讨论(0)
  • 2020-11-22 01:01

    Here is the sample code for saving bitmap to file :

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

    Now call this function to save the bitmap to internal memory.

    File newfile = savebitmap(bitmap);

    I hope it will help you. Happy codeing life.

    0 讨论(0)
  • 2020-11-22 01:02

    Why not call the Bitmap.compress method with 100 (which sounds like it is lossless)?

    0 讨论(0)
  • 2020-11-22 01:04

    The way I found to send PNG and transparency.

    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")));
    
    0 讨论(0)
  • 2020-11-22 01:06
    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();
    }
    
    0 讨论(0)
  • 2020-11-22 01:06

    Some new devices don't save bitmap So I explained a little more..

    make sure you have added below Permission

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    and create a xml file under xml folder name provider_paths.xml

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path
            name="external_files"
            path="." />
    </paths>
    

    and in AndroidManifest under

    <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
    

    then simply call saveBitmapFile(passYourBitmapHere)

    public static void saveBitmapFile(Bitmap bitmap) throws IOException {
            File mediaFile = getOutputMediaFile();
            FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, getQualityNumber(bitmap), fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        }
    

    where

    File getOutputMediaFile() {
            File mediaStorageDir = new File(
                    Environment.getExternalStorageDirectory(),
                    "easyTouchPro");
            if (mediaStorageDir.isDirectory()) {
    
                // Create a media file name
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                        .format(Calendar.getInstance().getTime());
                String mCurrentPath = mediaStorageDir.getPath() + File.separator
                                + "IMG_" + timeStamp + ".jpg";
                File mediaFile = new File(mCurrentPath);
                return mediaFile;
            } else { /// error handling for PIE devices..
                mediaStorageDir.delete();
                mediaStorageDir.mkdirs();
                galleryAddPic(mediaStorageDir);
    
                return (getOutputMediaFile());
            }
        }
    

    and other methods

    public static int getQualityNumber(Bitmap bitmap) {
            int size = bitmap.getByteCount();
            int percentage = 0;
    
            if (size > 500000 && size <= 800000) {
                percentage = 15;
            } else if (size > 800000 && size <= 1000000) {
                percentage = 20;
            } else if (size > 1000000 && size <= 1500000) {
                percentage = 25;
            } else if (size > 1500000 && size <= 2500000) {
                percentage = 27;
            } else if (size > 2500000 && size <= 3500000) {
                percentage = 30;
            } else if (size > 3500000 && size <= 4000000) {
                percentage = 40;
            } else if (size > 4000000 && size <= 5000000) {
                percentage = 50;
            } else if (size > 5000000) {
                percentage = 75;
            }
    
            return percentage;
        }
    

    and

    void galleryAddPic(File f) {
            Intent mediaScanIntent = new Intent(
                    "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);
    
            this.sendBroadcast(mediaScanIntent);
        }
    
    0 讨论(0)
提交回复
热议问题