当前位置: 代码迷 >> Android >> Android使用Bit地图Factory.Options解决加载大图片内存溢出有关问题
  详细解决方案

Android使用Bit地图Factory.Options解决加载大图片内存溢出有关问题

热度:59   发布时间:2016-05-01 11:16:37.0
Android使用BitmapFactory.Options解决加载大图片内存溢出问题

由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存溢出(java.lang.OutOfMemoryError),只有在BitmapFactory加载图片时使用BitmapFactory.Options对相关参数进行配置来减少加载的像素。

1、设置缩放大小对图片作处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public?Bitmap getBitmapFromFile(File?dst,?int?width,?int?height)?{
? ??if?(null?!=?dst?&&?dst.exists())?{
? ? ? ? BitmapFactory.Options?opts?=?null;
? ? ? ??if?(width?>?0?&&?height?>?0)?{
? ? ? ? ? ? opts?=?new?BitmapFactory.Options();
? ? ? ? ? ? opts.inJustDecodeBounds?=?true;
? ? ? ? ? ? BitmapFactory.decodeFile(dst.getPath(), opts);
? ? ? ? ? ??// 计算图片缩放比例
? ? ? ? ? ??final?int?minSideLength?=?Math.min(width, height);
? ? ? ? ? ? opts.inSampleSize?=?computeSampleSize(opts, minSideLength,
? ? ? ? ? ? ? ? ? ? width?*?height);
? ? ? ? ? ? opts.inJustDecodeBounds?=?false;
? ? ? ? ? ? opts.inInputShareable?=?true;
? ? ? ? ? ? opts.inPurgeable?=?true;
? ? ? ??}
? ? ? ??try?{
? ? ? ? ? ??return?BitmapFactory.decodeFile(dst.getPath(), opts);
? ? ? ??}?catch?(OutOfMemoryError?e)?{
? ? ? ? ? ? e.printStackTrace();
? ? ? ??}
? ??}
? ??return?null;
}
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
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;
}

private?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;
? ??}
}

转载请注明地址:?http://orgcent.com/android-outofmemoryerror-load-big-image/ | 萝卜白菜的博客

  相关解决方案