转自: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. */ public
static int
computeSampleSize(BitmapFactory.Options options, int
minSideLength, int
maxNumOfPixels) { int
initialSize = computeInitialSampleSize(options, minSideLength,
maxNumOfPixels); int
roundedSize; if
(initialSize <= 8 ) { roundedSize =
1 ; while
(roundedSize < initialSize) { roundedSize <<=
1 ; } }
else { roundedSize = (initialSize +
7 ) / 8
* 8 ; } return
roundedSize; } public
static int
computeInitialSampleSize(BitmapFactory.Options options, int
minSideLength, int
maxNumOfPixels) { double
w = options.outWidth; double
h = options.outHeight; int
lowerBound = (maxNumOfPixels == - 1 ) ?
1 : ( int ) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int
upperBound = (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. return
lowerBound; } if
((maxNumOfPixels == - 1 ) && (minSideLength == - 1 )) { return
1 ; }
else if
(minSideLength == - 1 ) { return
lowerBound; }
else { return
upperBound; } } } |