Android Bitmap在不加载图片的前提下获取图片宽高大小
2017-03-22 13:56:44  By: shinyuu

类似于朋友圈的单一图片展示功能、相信大家都注意到了、在朋友圈里面会提前设置好ImageView的大小、然后加载之后不会对整个布局的调度做改变、那么这是怎么做到的呢、其实是在没有加载图片之前先获取到图片宽高、然后再对ImageView进行大小的控制、可参考如下代码


方案一

/** 
* 根据View(主要是ImageView)的宽和高来获取图片的缩略图 
* @param path 
* @param viewWidth 
* @param viewHeight 
* @return 
*/ 
private Bitmap decodeThumbBitmapForFile(String path, int viewWidth, int viewHeight){  
    BitmapFactory.Options options = new BitmapFactory.Options();  
    //设置为true,表示解析Bitmap对象,该对象不占内存  
    options.inJustDecodeBounds = true;  
    BitmapFactory.decodeFile(path, options);  
    //设置缩放比例  
    options.inSampleSize = computeScale(options, viewWidth, viewHeight);  
      
    //设置为false,解析Bitmap对象加入到内存中  
    options.inJustDecodeBounds = false;  
      
    return BitmapFactory.decodeFile(path, options);  
}  

/** 
* 根据View(主要是ImageView)的宽和高来计算Bitmap缩放比例。默认不缩放 
* @param options 
* @param width 
* @param height 
*/ 
private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){  
    int inSampleSize = 1;  
    if(viewWidth == 0 || viewHeight == 0){  
        return inSampleSize;  
    }  
    int bitmapWidth = options.outWidth;  
    int bitmapHeight = options.outHeight;  
      
    //假如Bitmap的宽度或高度大于我们设定图片的View的宽高,则计算缩放比例  
    if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){  
        int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);  
        int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);  
          
        //为了保证图片不缩放变形,我们取宽高比例最小的那个  
        inSampleSize = widthScale < heightScale ? widthScale : heightScale;  
    }  
    return inSampleSize;  
}  


方案二

BitmapFactory.Options options = new BitmapFactory.Options();  
          
/** 
* 最关键在此,把options.inJustDecodeBounds = true; 
* 这里再decodeFile(),返回的bitmap为空,但此时调用options.outHeight时,已经包含了图片的高了 
*/ 
options.inJustDecodeBounds = true;  
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); // 此时返回的bitmap为null  
/** 
*options.outHeight为原始图片的高 
*/ 
Log.e("Test", "Bitmap Height == "   options.outHeight);


根据这些方法,可以在实际加载Bitmap图片之前根据需要设置图片缩小为原来的(1/2,1/4,1/8,1/16..)、下面是Android源码中关于 inSampleSize的说明

public int inSampleSize


Added in API level 1

If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory. The sample size is the number of pixels in either dimension that correspond to a single pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: the decoder uses a final value based on powers of 2, any other value will be rounded down to the nearest power of 2.

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


猜你喜欢的

快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+