PNG和JPEG内存分配的区别

时间:2014-03-17 15:27:30

标签: android memory memory-management bitmap

我有一张图片保存到两个文件中:png和jpeg。然后我使用默认颜色深度(Bitmap.Config.ARGB_8888

加载它们

分配跟踪器显示两个图像都消耗了1904016个字节。好的,看起来很好。但后来我添加了Bitmap.Config.RGB_565和jpg图像消耗了952016个字节,但是png图像仍然使用1904015.为什么会这样?

public class MainActivity extends Activity {

    private BitmapDrawable png;
    private BitmapDrawable jpg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btnDecode8888).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                decode(null);
            }
        });

        findViewById(R.id.btnDecode565).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Bitmap.Config.RGB_565;
                decode(options);
            }
        });
    }

    private void decode(BitmapFactory.Options options) {
        png = decodeFile("/mnt/sdcard/img.png", options);
        jpg = decodeFile("/mnt/sdcard/img.jpg", options);
    }

    private BitmapDrawable decodeFile(String path, BitmapFactory.Options options){
        BitmapDrawable result = null;
        try {
            FileInputStream file = new FileInputStream(path);
            Bitmap bitmap = BitmapFactory.decodeStream(file, null, options);
            result = new BitmapDrawable(getResources(), bitmap);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return result;
    }
}

2 个答案:

答案 0 :(得分:1)

您所描述的内容与PNG和JPEG的相对优点无关。这是一个潜在的实施问题。

普通的JPEG(JFIF)每像素有24位。解压缩(忽略YCBCR和采样)时,R,G和B组件最终为8位。

PNG也具有8位(忽略更高)的颜色深度和这些颜色的多种表示方法。 您正在尝试下采样,将8-r,8-g,8-b(每像素24位)转换为5-r,8-g,5-b(16位)。

这种转换可以从PNG图像和JPEG图像一样容易地完成。如果您发现系统存在差异,那就是您的系统软件。这听起来好像它没有将24bpp(实际上是因为alpha通道的32)转换为png的16bpp,尽管这是完全可能的。

答案 1 :(得分:-1)

解释这个的最好方法是对类似问题的现有答案:

PNG vs. GIF vs. JPEG vs. SVG - When best to use?

他解释得比我更好;)