欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android图片压缩的实例详解

程序员文章站 2023-12-12 17:52:04
android图片压缩的实例详解 在做微信分享的时候,由于分享的缩略图要求不得大于32k,否则不能调起微信,所以总结了一下android图片的压缩问题,大部分资料都是来自...

android图片压缩的实例详解

在做微信分享的时候,由于分享的缩略图要求不得大于32k,否则不能调起微信,所以总结了一下android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己记忆,于是总结如下。

android图片压缩主要有两种方式:1.压缩图片分辨率 2.压缩图片质量

一、先看压缩图片分辨率,很好理解,如本来1280*768的图片压缩为640*384大小。废话不说,直接上代码:



/** 
   * 按比例压缩图片分辨率 
   * @param inbitmap 
   * @param outheight 输出图片高度,可据此保持比例计算输出宽度 
   * @param needrecycled 是否回收inbitmap 
   * @return 
   */ 
  public static bitmap createscaledbitmapbyoutheight(bitmap inbitmap, int outheight, boolean needrecycled) {      
    int bitmapheight = inbitmap.getheight(); 
    int bitmapwidth = inbitmap.getwidth(); 
    int outwidth = bitmapwidth * outheight / bitmapheight; 
     
    return createscaledbitmap(inbitmap, outwidth, outheight, needrecycled); 
  }  
   
  /** 
   * 按比例压缩图片分辨率 
   * @param inbitmap 
   * @param outheight 输出图片宽度,可据此保持比例计算输出高度 
   * @param needrecycled 是否回收inbitmap 
   * @return 
   */ 
  public static bitmap createscaledbitmapbyoutwidth(bitmap inbitmap, int outwidth, boolean needrecycled) {     
    int bitmapheight = inbitmap.getheight(); 
    int bitmapwidth = inbitmap.getwidth(); 
    int outheight = bitmapheight * outwidth / bitmapwidth; 
     
    return createscaledbitmap(inbitmap, outwidth, outheight, needrecycled); 
  } 
   
  /** 
   * 指定输出的宽高缩放图片 
   * @param inbitmap 
   * @param outwidth 
   * @param outheight 
   * @param needrecycled 
   * @return 
   */ 
  public static bitmap createscaledbitmap(bitmap inbitmap, int outwidth, int outheight, boolean needrecycled) {         
     
    bitmap thumbbmp = bitmap.createscaledbitmap(inbitmap, outwidth, outheight, true); 
    if (needrecycled) { 
      inbitmap.recycle(); 
    } 
     
    return thumbbmp; 
  } 

前两个方法可以指定期望的宽度或高度,并按比例缩放图片的分辨率,第3个方法可以随意指定期望的宽高,缩放图片。

上面代码是对输入的bitmap进行缩放,还可以从资源或文件中加载图片并缩放,具体如下:

/** 
   * 从资源加载并压缩图片 
   * @param res 
   * @param resid 
   * @param outwidth 目标宽度 
   * @param outheight 目标高度 
   * @return 
   */ 
  public static bitmap decodesampledbitmapfromresource(resources res, int resid,  
      int outwidth, int outheight) {  
    final bitmapfactory.options options = new bitmapfactory.options();  
    options.injustdecodebounds = true; // 假解,来获取图片大小  
    bitmapfactory.decoderesource(res, resid, options);  
    options.insamplesize = calculateinsamplesize(options, outwidth, outheight);  
    // 使用获取到的insamplesize值再次解析图片  
    options.injustdecodebounds = false; 
    //options.inpreferredconfig = config.rgb_565; 
    return bitmapfactory.decoderesource(res, resid, options);  
  }  
   
  /** 
   * 从文件中加载并压缩图片 
   * @param res 
   * @param resid 
   * @param outwidth 目标宽度 
   * @param outheight 目标高度 
   * @return 
   */ 
  public static bitmap decodesampledbitmapfromfile(string pathname, int outwidth, int outheight) { 
    final bitmapfactory.options options = new bitmapfactory.options();  
    options.injustdecodebounds = true; // 假解,来获取图片大小  
    bitmapfactory.decodefile(pathname, options); 
    options.insamplesize = calculateinsamplesize(options, outwidth, outheight);  
    // 使用获取到的insamplesize值再次解析图片  
    options.injustdecodebounds = false; 
    //options.inpreferredconfig = config.rgb_565; 
    return bitmapfactory.decodefile(pathname, options); 
  }  
   
  /** 
   * 计算options.insamplesize 
   * @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的值,这样可以保证最终图片的宽和高  
      // 一定都会大于等于目标的宽和高。  
      insamplesize = heightratio < widthratio ? heightratio : widthratio;  
    }  
    return insamplesize;  
  }  

二、压缩图片的质量

/** 
   * 压缩图片质量,把图片压缩到outsize以内 
   * @param inbitmap 原始bitmap 
   * @param outsize 压缩到的大小 
   * @param needrecycled 是否回收bitmap 
   * @return 
   */ 
  public static bitmap compressimage(bitmap inbitmap, int outsize, boolean needrecycled) {  
      
    bytearrayoutputstream baos = new bytearrayoutputstream();  
    inbitmap.compress(bitmap.compressformat.jpeg, 100, baos); 
    int quality = 100;  
    while (baos.tobytearray().length / 1024 > outsize) { 
      if (quality <= 0) { 
        bytearrayinputstream outbais = new bytearrayinputstream(baos.tobytearray()); 
        return bitmapfactory.decodestream(outbais, null, null);// 如果quality为0时还未达到32k以内,返回得到的最小值;如需要可结合分辨率压缩 
      } 
      baos.reset(); 
      //png格式下,这种压缩不起作用(quality:0-100,如果目标大小太小,有时候质量压缩不一定能达到效果,需结合分辨率压缩) 
      inbitmap.compress(bitmap.compressformat.jpeg, quality, baos); 
      log.e("an", "bitmap size:"+ baos.tobytearray().length / 1024 + "k"); 
      quality -= 10; 
    } 
    if (needrecycled) { 
      inbitmap.recycle(); 
    } 
     
     
    bytearrayinputstream bais = new bytearrayinputstream(baos.tobytearray()); 
    bitmap outbitmap= bitmapfactory.decodestream(bais, null, null);//bytearrayinputstream转成bitmap 
     
    return outbitmap;  
  } 


需要注意的是compress方法,该压缩方法只对jpeg格式有效,对于png格式,则会忽略第二个参数quality,即压缩不起作用。这种压缩只是对图片质量有影响,并不会改变图片大小。

当然,如有需要,以上两种压缩方法可以结合使用。

以上就是android 图片压缩的实现方法的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: