Android Bitmap之解说

  在日常开发中,可以说和Bitmap低头不见抬头见,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识。

  所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析。

  区别decodeResource()和decodeFile()

  这里的区别不是指方法名和参数的区别,而是对于解码后图片尺寸在处理上的区别:

  decodeFile()用于读取SD卡上的图,得到的是图片的原始尺寸

  decodeResource()用于读取Res、Raw等资源,得到的是图片的原始尺寸 * 缩放系数

  可以看的出来,decodeResource()比decodeFile()多了一个缩放系数,缩放系数的计算依赖于屏幕密度,当然这个参数也是可以调整的:

  // 通过BitmapFactory.Options的这几个参数可以调整缩放系数

  public class BitmapFactory {

  public static class Options {

  // 默认true

  public boolean inScaled;

  // 无dpi的文件夹下默认160

  public int inDensity;

  // 取决具体屏幕

  public int inTargetDensity;

  }

  }

  我们分具体情况来看,现在有一张720x720的图片:

  inScaled属性

  如果inScaled设置为false,则不进行缩放,解码后图片大小为720x720; 否则请往下看。

  如果inScaled设置为true或者不设置,则根据inDensity和inTargetDensity计算缩放系数。

  默认情况

  把这张图片放到drawable目录下, 默认:

  以720p的红米3为例子,缩放系数 = inTargetDensity(具体320 / inDensity(默认160)= 2 = density,解码后图片大小为1440x1440。

  以1080p的MX4为例子,缩放系数 = inTargetDensity(具体480 / inDensity(默认160)= 3 = density, 解码后图片大小为2160x2160。

  *dpi文件夹的影响

  把图片放到drawable或者draw这样不带dpi的文件夹,会按照上面的算法计算。

  如果放到xhdpi会怎样呢? 在MX4上,放到xhdpi,解码后图片大小为1080 x 1080。

  因为放到有dpi的文件夹,会影响到inDensity的默认值,放到xhdpi为160 x 2 = 320; 所以缩放系数 = 480(屏幕) / 320 (xhdpi) = 1.5; 所以得到的图片大小为1080 x 1080。

  手动设置缩放系数

  如果你不想依赖于这个系统本身的density,你可以手动设置inDensity和inTargetDensity来控制缩放系数:

  BitmapFactory.Options options =

  new BitmapFactory.Options();

  options.inJustDecodeBounds = false;

  options.inSampleSize = 1;

  options.inDensity = 160;

  options.inTargetDensity = 160;

  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.origin, options);

  // MX4上,虽然density = 3

  // 但是通过设置inTargetDensity / inDensity = 160 / 160 = 1

  // 解码后图片大小为720x720

  System.out.println(“w:” + bitmap.getWidth() + “, h:” + bitmap.getHeight());

你可能感兴趣的:(Android Bitmap之解说)