android使用inSampleSize、inScaled、inDensity、inTargetDensity对图片进行缩放

来源:互联网 发布:centos配置桥接模式 编辑:程序博客网 时间:2024/05/19 05:34
 

android使用inSampleSize、inScaled、inDensity、inTargetDensity对图片进行缩放

标签: androidBitmapBitmapFactory.OptioninSampleSizeinScaled
 4764人阅读 评论(3) 收藏 举报
 分类:
    

一般来说,在Android中对图片进行缩放,我们使用以下的代码:

[java] view plain copy
  1. public Bitmap resizeImage(Bitmap bitmap, int w, int h) {  
  2.     Bitmap BitmapOrg = bitmap;  
  3.     int width = BitmapOrg.getWidth();  
  4.     int height = BitmapOrg.getHeight();  
  5.     int newWidth = w;  
  6.     int newHeight = h;  
  7.   
  8.     float scaleWidth = ((float) newWidth) / width;  
  9.     float scaleHeight = ((float) newHeight) / height;  
  10.   
  11.     Matrix matrix = new Matrix();  
  12.     matrix.postScale(scaleWidth, scaleHeight);  
  13.     Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 00, width,  
  14.             height, matrix, true);  
  15.     return resizedBitmap;  
  16. }  

上面这段代码也是一般对图片的进行缩放的方式,不会出什么问题,但是有两个小问题:

1、我们先要从磁盘上先将图片加载到内存,然后才能对图片进行缩放,在移动设备上对内存的要求比较高,这在一定程度上降级了性能。

2、我们使用Bitmap.createBitmap这个方法进行缩放,使用的是Java层面的方法来缩放,我们知道Java层面对图片,视频等进行处理是有性能损失的。

如果只有一两张图片,用上面的方法进行缩放是没有问题的,如果是大量的图片或者是图片很大,就会出现明显降低性能,甚至出现OOM的异常,OOM的异常是必须要处理的。

下面给出优化方案,优化我们也是基于上面两点问题给出的。一次性从磁盘上读取并缩放,而且这个缩放实在Native层,能够显著提高效率,代码如下:

[java] view plain copy
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.activity_main);  
  5.     try {  
  6.         BitmapFactory.Options options = new BitmapFactory.Options();  
  7.         options.inJustDecodeBounds = true;  
  8.         BitmapFactory.decodeStream(getAssets().open("g_b090.jpg"), null, options);  
  9.           
  10.         int targetDensity = getResources().getDisplayMetrics().densityDpi;  
  11.           
  12.         DisplayMetrics dm = new DisplayMetrics();  
  13.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  14.           
  15.         int x = dm.widthPixels;  
  16.         int y = dm.heightPixels;  
  17.         options.inSampleSize = calculateInSampleSize(options, x, y);  
  18.           
  19.         double xSScale = ((double)options.outWidth) / ((double)x);    
  20.         double ySScale = ((double)options.outHeight) / ((double)y);  
  21.           
  22.         double startScale = xSScale > ySScale ? xSScale : ySScale;    
  23.           
  24.         options.inScaled = true;  
  25.         options.inDensity = (int) (targetDensity*startScale);  
  26.         options.inTargetDensity = targetDensity;  
  27.         options.inJustDecodeBounds = false;  
  28.         Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("g_b090.jpg"), null, options);  
  29.       
  30.     } catch (IOException e) {  
  31.         e.printStackTrace();  
  32.     }  
  33. }  

其中calculateInSampleSize方法如下

[java] view plain copy
  1. public int calculateInSampleSize(BitmapFactory.Options options,  
  2.             int reqWidth, int reqHeight) {  
  3.         // Raw height and width of image  
  4.         final int height = options.outHeight;  
  5.         final int width = options.outWidth;  
  6.         int inSampleSize = 1;  
  7.   
  8.         if (height > reqHeight || width > reqWidth) {  
  9.   
  10.             final int halfHeight = height / 2;  
  11.             final int halfWidth = width / 2;  
  12.   
  13.             // Calculate the largest inSampleSize value that is a power of 2 and  
  14.             // keeps both  
  15.             // height and width larger than the requested height and width.  
  16.             while ((halfHeight / inSampleSize) > reqHeight  
  17.                     && (halfWidth / inSampleSize) > reqWidth) {  
  18.                 inSampleSize *= 2;  
  19.             }  
  20.         }  
  21.   
  22.         return inSampleSize;  
  23.     }  

这段代码是google给出的,我们无需对它进行修改,在上面这段代码中我们使用BitmapFactory.Options的inScaled,inDensity,inTargetDensity来变相对图片进行缩放,但是这有一个局限,就是只能对图片进行等比例的放大或者缩小,不能按任意大小进行缩放,不过这还是适用大部分的情况,因为很少有对图片进行任意的缩放,因为那样会使图片变形。大家有什么问题或者有什么错误,请给我留言,大家一起讨论!!!
阅读全文
1 0
原创粉丝点击