【问题标题】:Difference between PNG and JPEG memory allocationPNG和JPEG内存分配的区别
【发布时间】:2014-04-22 21:32:55
【问题描述】:

我有一张图片保存在两个文件中: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;
    }
}

【问题讨论】:

  • 你确定你都像 565 一样解码吗?
  • 它可以重复吗?如果您要重复体验,内存分配的数量是否完全相同?
  • @blackbelt 是的,我添加了完整代码。
  • @Tonio 是的,我重复了几次。分配仍然相同。

标签: android memory memory-management bitmap


【解决方案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 位)。

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

【讨论】:

    【解决方案2】:

    解释这一点的最佳方法是使用类似问题的现有答案:

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

    他解释得比我好;)

    【讨论】:

    • 它解释了什么?
    • 它解释了一般来说,png(无损,压缩)比 jpeg(有损,压缩)更重。不过,我想知道为什么它们与 ARGB_8888 的重量相同。因此,虽然这对我来说似乎是相关信息,但它并不能完全回答问题。
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2021-06-05
    • 2023-03-07
    相关资源
    最近更新 更多