computeSampleSize

来源:互联网 发布:苹果平板怎么淘宝开店 编辑:程序博客网 时间:2024/05/14 20:49

转自:http://my.csdn.net/zljk000/code/detail/18212

computeSampleSize方法,返回一个合适的options.inSampleSize值

Java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Util {
 
     /*
     * Compute the sample size as a function of minSideLength
     * and maxNumOfPixels.
     * minSideLength is used to specify that minimal width or height of a
     * bitmap.
     * maxNumOfPixels is used to specify the maximal size in pixels that is
     * tolerable in terms of memory usage.
     *
     * The function returns a sample size based on the constraints.
     * Both size and minSideLength can be passed in as IImage.UNCONSTRAINED,
     * which indicates no care of the corresponding constraint.
     * The functions prefers returning a sample size that
     * generates a smaller bitmap, unless minSideLength = IImage.UNCONSTRAINED.
     *
     * Also, the function rounds up the sample size to a power of 2 or multiple
     * of 8 because BitmapFactory only honors sample size this way.
     * For example, BitmapFactory downsamples an image by 2 even though the
     * request is 3. So we round up the sample size to avoid OOM.
     */
    publicstatic int computeSampleSize(BitmapFactory.Options options,
            intminSideLength, intmaxNumOfPixels) {
        intinitialSize = computeInitialSampleSize(options, minSideLength,
                maxNumOfPixels);
 
        introundedSize;
        if(initialSize <= 8) {
            roundedSize =1;
            while(roundedSize < initialSize) {
                roundedSize <<=1;
            }
        }else {
            roundedSize = (initialSize +7) / 8* 8;
        }
        returnroundedSize;
    }
     
    publicstatic int computeInitialSampleSize(BitmapFactory.Options options,
            intminSideLength, intmaxNumOfPixels) {
        doublew = options.outWidth;
        doubleh = options.outHeight;
        intlowerBound = (maxNumOfPixels == -1) ?1 :
                (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
        intupperBound = (minSideLength == -1) ?128 :
                (int) Math.min(Math.floor(w / minSideLength),
                Math.floor(h / minSideLength));
 
        if(upperBound < lowerBound) {
            // return the larger one when there is no overlapping zone.
            returnlowerBound;
        }
 
        if((maxNumOfPixels == -1) &&
                (minSideLength == -1)) {
            return1;
        }else if(minSideLength == -1) {
            returnlowerBound;
        }else {
            returnupperBound;
        }
    }
     
}
原创粉丝点击