由于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/ | 萝卜白菜的博客