Android图片压缩几种方式总结

Android图片压缩几种方式总结,第1张

概述Android图片压缩几种方式总结图片压缩在Android开发中很常见也很重要,防止图片的OOM也是压缩的重要原因。

AndroID图片压缩几种方式总结

图片压缩在AndroID开发中很常见也很重要,防止图片的OOM也是压缩的重要原因。

首先看下Bitmap图片文件的大小的决定因素:

Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数。3个参数,任意减少一个的值,就达到了压缩的效果。

接下来看下Bitmap图片的几种格式的特点:

Alpha_8
 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
 ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

如果进行图片格式的压缩的话,一般情况下都是ARGB_8888转为RGB565进行压缩。

写了一个工具类,基本上列举了androID上图片的几种基本压缩方式:

1.质量压缩

2.采样率压缩

3.尺寸压缩

4.Matrix压缩

5.图片格式的压缩,例如PNG和JPG保存后的图片大小是不同的

public class Utils {    /**    * 采样率压缩    *    * @param bitmap    * @param sampleSize 采样率为2的整数倍,非整数倍四舍五入,如4的话,就是原图的1/4    * @return 尺寸变化    */   public static Bitmap getBitmap(Bitmap bitmap,int sampleSize) {     BitmapFactory.Options options = new BitmapFactory.Options();     options.inSampleSize = sampleSize;     ByteArrayOutputStream baos = new ByteArrayOutputStream();     bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);     byte[] bytes = baos.toByteArray();     Bitmap bit = BitmapFactory.decodeByteArray(bytes,bytes.length,options);     Log.i("info","图片大小:" + bit.getByteCount());//2665296  10661184     return bit;   }    /**    * 图片质量压缩    *    * @param bitmap    * @param quality    * @return 尺寸不变,质量变小    */   public static Bitmap compressByQuality(Bitmap bitmap,int quality) {     ByteArrayOutputStream baos = new ByteArrayOutputStream();     bitmap.compress(Bitmap.CompressFormat.JPEG,quality,bytes.length);     Log.i("info","图片大小:" + bit.getByteCount());//10661184     return bit;   }    /**    * 图片质量压缩    *    * @param src    * @param maxByteSize    * @return    */   public static Bitmap compressByQuality(Bitmap src,long maxByteSize) {     ByteArrayOutputStream baos = new ByteArrayOutputStream();     int quality = 100;     src.compress(Bitmap.CompressFormat.JPEG,baos);     while (baos.toByteArray().length > maxByteSize && quality > 0) {       baos.reset();       src.compress(Bitmap.CompressFormat.JPEG,quality -= 5,baos);     }     if (quality < 0) return null;     byte[] bytes = baos.toByteArray();     Bitmap bit = BitmapFactory.decodeByteArray(bytes,bytes.length);     return bit;   }    public static Bitmap compressByFormat(Bitmap bitmap,int format) {     ByteArrayOutputStream baos = new ByteArrayOutputStream();     bitmap.compress(Bitmap.CompressFormat.JPEG,"图片大小:" + bit.getByteCount());//10661184     return bit;   }    /**    * Matrix缩放    *    * @param bitmap    * @param scaleWIDth    * @param scaleHeight    * @return 尺寸和大小变化    */   public static Bitmap getBitmapBySize(Bitmap bitmap,float scaleWIDth,float scaleHeight) {     Matrix matrix = new Matrix();     matrix.postscale(scaleWIDth,scaleHeight);     Bitmap bit = Bitmap.createBitmap(bitmap,bitmap.getWIDth(),bitmap.getHeight(),matrix,false);     Log.i("info","图片大小:" + bit.getByteCount());     return bit;   }    /**    * 按照图片格式配置压缩    *    * @param path    * @param config Alpha_8,ARGB_4444,ARGB_8888,RGB_565;    * @return RGB_565比ARGB_8888节省一半内存    */   public static Bitmap getBitmapByFormatConfig(String path,Bitmap.Config config) {     BitmapFactory.Options options = new BitmapFactory.Options();     options.inPreferredConfig = config;     Bitmap bitmap = BitmapFactory.decodefile(path,"图片大小:" + bitmap.getByteCount());     return bitmap;   }    /**    * 指定大小缩放    *    * @param bitmap    * @param wIDth    * @param height    * @return    */   public static Bitmap getBitmapByScaleSize(Bitmap bitmap,int wIDth,int height) {     Bitmap bit = Bitmap.createScaledBitmap(bitmap,wIDth,height,true);     Log.i("info","图片大小:" + bit.getByteCount());     return bit;   }    /**    * 通过保存格式压缩    *    * @param bitmap    * @param format JPEG,PNG,WEBP    * @return    */   public static Bitmap getBitmapByFormat(Bitmap bitmap,Bitmap.CompressFormat format) {     ByteArrayOutputStream baos = new ByteArrayOutputStream();     bitmap.compress(format,"图片大小:" + bit.getByteCount());     return bit;   }    /**    * 文件加载压缩    *    * @param filePath    * @param inSampleSize    * @return    */   public static Bitmap getBitmap(String filePath,int inSampleSize) {     BitmapFactory.Options options = new BitmapFactory.Options();     options.inJustDecodeBounds = true;     BitmapFactory.decodefile(filePath,options);//此时不耗费和占用内存     options.inSampleSize = inSampleSize;     options.inJustDecodeBounds = false;     return BitmapFactory.decodefile(filePath,options);   }    public static Bitmap getBitmap(String filePath) {     return BitmapFactory.decodefile(filePath);   }    public static Bitmap vIEw2Bitmap(VIEw vIEw) {     if (vIEw == null) return null;     Bitmap ret = Bitmap.createBitmap(vIEw.getWIDth(),vIEw.getHeight(),Bitmap.Config.ARGB_8888);     Canvas canvas = new Canvas(ret);     Drawable bgDrawable = vIEw.getBackground();     if (bgDrawable != null) {       bgDrawable.draw(canvas);     } else {       canvas.drawcolor(color.WHITE);     }     vIEw.draw(canvas);     return ret;   }    public static voID saveBitmap(Bitmap bitmap) {     file file = new file(Environment.getExternalStorageDirectory() + "/img.jpg");     try {       fileOutputStream fileOutputStream = new fileOutputStream(file);       bitmap.compress(Bitmap.CompressFormat.JPEG,fileOutputStream);       fileOutputStream.flush();       fileOutputStream.close();     } catch (fileNotFoundException e) {       e.printstacktrace();     } catch (IOException e) {       e.printstacktrace();     }   }    public static voID saveBitmap(Bitmap bitmap,Bitmap.CompressFormat format) {     file file = new file(Environment.getExternalStorageDirectory() + "/img.jpg");     try {       fileOutputStream fileOutputStream = new fileOutputStream(file);       bitmap.compress(format,fileOutputStream);       fileOutputStream.flush();       fileOutputStream.close();     } catch (fileNotFoundException e) {       e.printstacktrace();     } catch (IOException e) {       e.printstacktrace();     }   } } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Android图片压缩几种方式总结全部内容,希望文章能够帮你解决Android图片压缩几种方式总结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存