Android图片上传,太大需要压缩处理方法2016-01-16 01:13:39

( 1人已投票,[高质量] )
分享:
31.3K

搞Android开发,只要扯到图片就意味着你与OOM相距并不远,图片稍大一点就让人处理起来四处碰壁,有经验的同学可能立马想到,图片是需要压缩处理才能最有效的避免这些问题。

下面首先给出Android压缩图片的方法:


/**
   * 根据图片实际尺寸和待显示尺寸计算图片压缩比率
   * @param options
   * @param reqWidth   显示宽度
   * @param reqHeight   显示高度
   * @return       压缩比率
   */
  public static int calculateInSampleSize(BitmapFactory.Options options,
      int reqWidth, int reqHeight) {
    //实际宽、高
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;
    if (height > reqHeight || width > reqWidth) {
      final int heightRatio = Math.round((float) height
          / (float) reqHeight);
      final int widthRatio = Math.round((float) width / (float) reqWidth);
      inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
  }
  /**
   * 根据显示尺寸,获取压缩后的图片
   * @param res
   * @param resId
   * @param reqWidth   显示宽度
   * @param reqHeight   显示高度
   * @return
   */
  public static Bitmap decodeSampledBitmapFromResource(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);
    // 设置压缩选项
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
  }


android中的大图片一般都要经过压缩才显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节。

打开Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看

枚举变量
public static final Bitmap.Config ALPHA_8
public static final Bitmap.Config ARGB_4444
public static final Bitmap.Config ARGB_8888
public static final Bitmap.Config RGB_565

ALPHA_8, ARGB_4444,ARGB_8888,RGB_565 这是些什么东西

其实这都是色彩的存储方法:我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值

说白了就ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位

由此可见:
ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图
ARGB_8888 代表32位ARGB位图
RGB_565 代表8位RGB位图

位图位数越高代表其可以存储的颜色信息越多,当然图像越真。

在压缩之前将option的值设置一下。





头像

snowcoal
  • Android
  • bitmap
  • 图片压缩

收藏到我的私密空间

标题:Android图片上传,太大需要压缩处理方法

作者:柳岸花明

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限

如果本站的内容有幸帮助到了您,建议您了解一下当页的广告内容哦,我们的进步离不开您的支持,Thank you~