如何在不丢失原始文件的情况下压缩图像?

时间:2018-06-14 22:18:56

标签: java android file image-compression

我在上传图片之前使用此代码进行图片压缩:

public File saveBitmapToFile(File file) {
    try {

        // BitmapFactory options to downsize the image
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        o.inSampleSize = 6;
        // factor of downsizing the image

        FileInputStream inputStream = new FileInputStream(file);
        //Bitmap selectedBitmap = null;
        BitmapFactory.decodeStream(inputStream, null, o);
        inputStream.close();

        // The new size we want to scale to
        final int REQUIRED_SIZE = 75;

        // Find the correct scale value. It should be the power of 2.
        int scale = 1;
        while (o.outWidth / scale / 2 >= REQUIRED_SIZE &&
                o.outHeight / scale / 2 >= REQUIRED_SIZE) {
            scale *= 2;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        inputStream = new FileInputStream(file);

        Bitmap selectedBitmap = BitmapFactory.decodeStream(inputStream, null, o2);
        inputStream.close();


        FileOutputStream outputStream = new FileOutputStream(file);


        selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);



        return file;
    } catch (Exception e) {
        return null;
    }
}

问题是原始图像会受到影响并调整大小。

如何在不重写和丢失原始图像的情况下压缩图像?

更新1:

我将代码的最后一部分更改为此但仍然无效。

现在图像不会调整大小

            File new_file =new File("/storage/emulated/0/DCIM/Screenshots/tmp.png");
        try
        {
            new_file.createNewFile();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        Log.d("Create File", "File exists?"+new_file.exists());

        FileOutputStream outputStream = new FileOutputStream(new_file);

        selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);


        return file;

更新2:

我已将代码更改为此,因此部分解决了问题。现在,我可以在名为tmp"+new Date()+".png的文件中保留每个图像的原始质量,但原始文件仍将被覆盖。

File new_file =new File(String.valueOf("/storage/emulated/0/DCIM/Screenshots/tmp"+new Date()+".png"));
        try
        {
            new_file.createNewFile();
            FileOutputStream outputStream = new FileOutputStream(new_file, true);
            selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);


        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        Log.d("Create File", "File exists?"+new_file.exists());

        FileOutputStream outputStream = new FileOutputStream(file);

        selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

2 个答案:

答案 0 :(得分:0)

创建一个新文件并使FileOutputStream写入它,而不是写入原始文件。

答案 1 :(得分:0)

新答案

你的情况非常独特,如果你试试这个:

不要直接使用InputStream中的Bitmap,而是尝试使用它copy()

这样,您压缩的那个将是Bitmap的副本。您可以在新FileOutputStream中压缩它而无需修改原始文件。

删除第二次压缩。只是不对原始文件做任何事情。