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