2.Bitmap优化

主要有两类方法:
一、decodeBitmap:对Bitmap不压缩,但是会根据屏幕的密度合适的进行缩放压缩
二、compressBimtap:对Bitmap进行超过最大宽高的压缩,同时也会根据屏幕的密度合适的进行缩放压缩。

public class BitmapDecodeUtil {
     private static final int DEFAULT_DENSITY =  240 ;
     private static final float SCALE_FACTOR =  0 .75f;
     private static final Bitmap.Config DEFAULT_BITMAP_CONFIG = Bitmap.Config.RGB_565;
     private static BitmapFactory.Options getBitmapOptions(Context context) {
         BitmapFactory.Options options =  new BitmapFactory.Options();
         options.inScaled =  true ;
         options.inPreferredConfig = DEFAULT_BITMAP_CONFIG;
         options.inPurgeable =  true ;
         options.inInputShareable =  true ;
         options.inJustDecodeBounds =  false ;
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
             Field field =  null ;
             try {
                 field = BitmapFactory.Options. class .getDeclaredField( "inNativeAlloc" );
                 field.setAccessible( true );
                 field.setBoolean(options,  true );
             catch (NoSuchFieldException e) {
                 e.printStackTrace();
             catch (IllegalAccessException e) {
                 e.printStackTrace();
             }
         }
         int displayDensityDpi = context.getResources().getDisplayMetrics().densityDpi;
         float displayDensity = context.getResources().getDisplayMetrics().density;
         if (displayDensityDpi > DEFAULT_DENSITY && displayDensity >  1 .5f) {
             int density = ( int ) (displayDensityDpi * SCALE_FACTOR);
             options.inDensity = density;
             options.inTargetDensity = density;
         }
         return options;
     }
     public static Bitmap decodeBitmap(Context context,  int resId) {
         checkParam(context);
         return BitmapFactory.decodeResource(context.getResources(), resId, getBitmapOptions(context));
     }
     public static Bitmap decodeBitmap(Context context, String pathName) {
         checkParam(context);
         return BitmapFactory.decodeFile(pathName, getBitmapOptions(context));
     }
     public static Bitmap decodeBitmap(Context context, InputStream is) {
         checkParam(context);
         checkParam(is);
         return BitmapFactory.decodeStream(is,  null , getBitmapOptions(context));
     }
     public static Bitmap compressBitmap(Context context, int resId,  int maxWidth,  int maxHeight) {
         checkParam(context);
         final TypedValue value =  new TypedValue();
         InputStream is =  null ;
         try {
             is = context.getResources().openRawResource(resId, value);
             return compressBitmap(context, is, maxWidth, maxHeight);
         catch (Exception e) {
             e.printStackTrace();
         finally {
             if (is !=  null ) {
                 try {
                     is.close();
                 catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
         return null ;
     }
     public static Bitmap compressBitmap(Context context, String pathName,  int maxWidth,  int maxHeight) {
         checkParam(context);
         InputStream is =  null ;
         try {
             is =  new FileInputStream(pathName);
             return compressBitmap(context, is, maxWidth, maxHeight);
         catch (FileNotFoundException e) {
             e.printStackTrace();
         finally {
             if (is !=  null ) {
                 try {
                     is.close();
                 catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
         return null ;
     }
     public static Bitmap compressBitmap(Context context, InputStream is,  int maxWidth,  int maxHeight) {
         checkParam(context);
         checkParam(is);
         BitmapFactory.Options opt =  new BitmapFactory.Options();
         opt.inJustDecodeBounds =  true ;
         BitmapFactory.decodeStream(is,  null , opt);
         int height = opt.outHeight;
         int width = opt.outWidth;
         int sampleSize = computeSampleSize(width, height, maxWidth, maxHeight);
         BitmapFactory.Options options = getBitmapOptions(context);
         options.inSampleSize = sampleSize;
         return BitmapFactory.decodeStream(is,  null , options);
     }
     private static int computeSampleSize( int width,  int height,  int maxWidth,  int maxHeight) {
         int inSampleSize =  1 ;
         if (height &amp;gt; maxHeight || width > maxWidth) {
             final int heightRate = Math.round(( float ) height / ( float ) maxHeight);
             final int widthRate = Math.round(( float ) width / ( float ) maxWidth);
             inSampleSize = heightRate < widthRate ? heightRate : widthRate;
         }
         if (inSampleSize %  2 !=  0 ) {
             inSampleSize -=  1 ;
         }
         return inSampleSize &amp;lt;=  1 1 : inSampleSize;
     }
     private static &amp;lt;T&amp;gt;  void checkParam(T param){
         if (param ==  null )
             throw new NullPointerException();
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值