由于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/ | 萝卜白菜的博客
相关推荐
Android 中加载大图片时内存溢出的...可以使用 BitmapFactory.Options、recycle() 方法、Java 中的内存优化技术、Android 中的内存优化技术、JNI 技术、避免使用大图片和缓存技术来减少内存的消耗,从而避免内存溢出。
在Android开发中,Bitmap对象是用于在屏幕上显示图像的核心组件,但如果不正确地管理,它可能会导致内存溢出(OOM)问题。BitmapFactory是Android提供的一个类,它提供了从多种来源(如文件、资源、流等)解码图像...
在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...
为了解决这个问题,我们需要了解 Android 加载大图片的机制,并掌握一些防止内存溢出的技巧。 首先,我们需要了解 Android 加载图片的机制。在 Android 中,加载图片可以使用多种方法,如 setImageBitmap、...
下面是一段具体的示例代码,展示如何使用上述方法解决大尺寸图片引起的内存溢出问题: ```java package xiaosi.compress; import android.app.Activity; import android.graphics.Bitmap; import android.graphics...
本篇文章将深入探讨如何在Android中有效解决图片加载导致的内存溢出问题。 首先,我们需要理解为什么图片加载会引发内存溢出。Android系统为每个应用分配了一定的内存限制,当加载大尺寸图片时,如果直接将其原样...
### Android有效解决图片过大内存溢出的问题 #### 一、问题背景 在Android开发过程中,尤其是在涉及大量图片处理的应用程序中,经常会遇到内存溢出的问题。这是因为Android设备的内存资源有限,而图片作为数据量较...
解决加载图片内存溢出的问题 在加载图片时,需要注意图片的大小不能超过 RAM 的内存。如果图片的大小超过了 RAM 的内存,就会出现 java.lang.OutOfMemoryError:bitmap size exceeds VM budget 异常。解决这个问题...
为了解决这一问题,Android SDK 提供了一系列解决方案,其中的核心方法是通过 Bitmap Factory 类加载图片时使用特定的选项来减少图片占用的内存。以下是一些关键知识点: 1. BitmapFactory 和 OutOfMemoryError:当...
总之,处理Android中的图片内存溢出问题,关键在于合理地缩放图片,使用BitmapFactory.Options的`inSampleSize`和`inJustDecodeBounds`属性,以及通过`computeSampleSize()`计算合适的缩放比例。这样可以有效地减少...
2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用...
在Android开发中,内存溢出(Out Of Memory,简称OOM)...在开发过程中,应持续关注应用的内存使用情况,使用内存分析工具如MAT或Android Studio自带的Profiler来定位和解决内存泄漏问题,从而提升应用的性能和稳定性。
本文将详细介绍如何解决在gallery中加载大量图片导致的内存溢出问题。 首先,我们需要理解Android的内存管理机制。Android系统使用Dalvik或ART虚拟机运行应用程序,它们都有内存限制。当加载大图或大量图片时,如果...
大图加载可能会导致内存溢出,因此通常会使用内存缓存和磁盘缓存策略,如LruCache和DiskLruCache。同时,可以使用BitmapFactory.Options配置来降低解码时的内存消耗,例如设置inSampleSize来控制图片的解码比例。 ...
在Android开发中,内存管理是至关重要的,尤其是处理图片资源时,经常遇到内存溢出(Out Of Memory,简称OOM)的问题。本项目提供了一个在Android 1.6 SDK环境下编写的工具类,旨在帮助开发者有效地避免内存溢出,...
Android 解决内存溢出的问题 Android 系统中的内存溢出问题是非常常见的,特别...解决 Android 中的内存溢出问题需要从多方面入手,包括优化图片加载、合理设计 ListView、 Lazy Loading 数据、避免重复使用代码等等。
理解Android图片处理的底层机制,合理使用`BitmapFactory`和`BitmapFactory.Options`,以及采取适当的内存管理策略,是防止图片加载导致的OOM的关键。在实际开发中,开发者应结合设备特性,灵活运用这些方法,以实现...
以下是一些有效解决Android加载大图片内存溢出问题的方法: 1. **使用`BitmapFactory.decodeStream`代替`setImageBitmap`、`setImageResource`或`BitmapFactory.decodeResource`**: - `setImageBitmap`、`...