为什么保存加载的Bitmap会增加它的大小?

时间:2014-03-13 18:27:08

标签: android bitmap android-resources

我从sdcard加载了一个png文件。我在某种程度上改变它,然后再次保存它。我注意到保存的文件比原始文件大得多。

起初我以为是因为修改了文件。然后我用下面的代码进行测试,但仍然会发生。

我只是加载一个png文件,然后用另一个名字保存。

原始文件 32Kb ,保存的文件 300Kb 。 有什么想法吗?

     try
     {  Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/Original.png");
        FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() + "/Saved.png"); 
        bm.compress(Bitmap.CompressFormat.PNG, 100, out);
     } 
     catch (Exception e)
     {  //Never gets here
     }

1 个答案:

答案 0 :(得分:3)

您可以通过压缩因子(质量)来控制Bitmap的尺寸:

Bitmap.compress(Bitmap.CompressFormat format, int quality, FileOutputStream out);

100 =最高质量,0 =低质量。

尝试使用“10”或其他东西来保持图像更小。 也可能是您正在加载一个 16位颜色的位图,然后将其保存为 32位颜色,从而增加其大小。

分别检查BitmapConfig.RGB_565BitmapConfig.ARGB_4444BitmapConfig.ARGB_8888

编辑:

以下是正确加载位图的方法:

public abstract class BitmapResLoader {

    public static Bitmap decodeBitmapFromResource(Bitmap.Config config, Resources res, int resId, int reqWidth, int reqHeight) {

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        options.inPreferredConfig = config;

        return BitmapFactory.decodeResource(res, resId, options);
    }

    private static int calculateInSampleSize(
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        return inSampleSize;
    }
}

在代码中:

// Bitmap.Config.RGB_565 = 16 Bit
Bitmap b = BitmapResLoader.decodeBitmapFromResource(Bitmap.Config.RGB_565, getResources(), width, height);

这样,您就可以控制将Bitmap加载到内存中的方式(请参阅Bitmap.Config)。