`
lt200819
  • 浏览: 187527 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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(* h / maxNumOfPixels));
    int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math
            .floor(/ minSideLength)Math.floor(/ 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有效解决加载大图片时内存溢出的问题

    Android 中加载大图片时内存溢出的...可以使用 BitmapFactory.Options、recycle() 方法、Java 中的内存优化技术、Android 中的内存优化技术、JNI 技术、避免使用大图片和缓存技术来减少内存的消耗,从而避免内存溢出。

    android BitmapFactory.Options使用方法详解

    在Android开发中,Bitmap对象是用于在屏幕上显示图像的核心组件,但如果不正确地管理,它可能会导致内存溢出(OOM)问题。BitmapFactory是Android提供的一个类,它提供了从多种来源(如文件、资源、流等)解码图像...

    处理bitmap内存溢出问题

    在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有效解决图片过大内存溢出的问题 #### 一、问题背景 在Android开发过程中,尤其是在涉及大量图片处理的应用程序中,经常会遇到内存溢出的问题。这是因为Android设备的内存资源有限,而图片作为数据量较...

    android_内存溢出处理

    解决加载图片内存溢出的问题 在加载图片时,需要注意图片的大小不能超过 RAM 的内存。如果图片的大小超过了 RAM 的内存,就会出现 java.lang.OutOfMemoryError:bitmap size exceeds VM budget 异常。解决这个问题...

    android处理图片内存溢出VM.pdf

    为了解决这一问题,Android SDK 提供了一系列解决方案,其中的核心方法是通过 Bitmap Factory 类加载图片时使用特定的选项来减少图片占用的内存。以下是一些关键知识点: 1. BitmapFactory 和 OutOfMemoryError:当...

    android 处理图片内存溢出 VM.pdf

    总之,处理Android中的图片内存溢出问题,关键在于合理地缩放图片,使用BitmapFactory.Options的`inSampleSize`和`inJustDecodeBounds`属性,以及通过`computeSampleSize()`计算合适的缩放比例。这样可以有效地减少...

    Android加载图片内存溢出问题解决方法

    2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用...

    Android 内存溢出的一些解决办法.doc

    在Android开发中,内存溢出(Out Of Memory,简称OOM)...在开发过程中,应持续关注应用的内存使用情况,使用内存分析工具如MAT或Android Studio自带的Profiler来定位和解决内存泄漏问题,从而提升应用的性能和稳定性。

    gallery加载大量图片时内存溢出的解决方法(一)

    本文将详细介绍如何解决在gallery中加载大量图片导致的内存溢出问题。 首先,我们需要理解Android的内存管理机制。Android系统使用Dalvik或ART虚拟机运行应用程序,它们都有内存限制。当加载大图或大量图片时,如果...

    Android下利用Bitmap切割图片

    大图加载可能会导致内存溢出,因此通常会使用内存缓存和磁盘缓存策略,如LruCache和DiskLruCache。同时,可以使用BitmapFactory.Options配置来降低解码时的内存消耗,例如设置inSampleSize来控制图片的解码比例。 ...

    android 轻松避免内存溢出

    在Android开发中,内存管理是至关重要的,尤其是处理图片资源时,经常遇到内存溢出(Out Of Memory,简称OOM)的问题。本项目提供了一个在Android 1.6 SDK环境下编写的工具类,旨在帮助开发者有效地避免内存溢出,...

    android解决内存溢出的问题..docx

    Android 解决内存溢出的问题 Android 系统中的内存溢出问题是非常常见的,特别...解决 Android 中的内存溢出问题需要从多方面入手,包括优化图片加载、合理设计 ListView、 Lazy Loading 数据、避免重复使用代码等等。

    android缩放图片代码实例

    理解Android图片处理的底层机制,合理使用`BitmapFactory`和`BitmapFactory.Options`,以及采取适当的内存管理策略,是防止图片加载导致的OOM的关键。在实际开发中,开发者应结合设备特性,灵活运用这些方法,以实现...

    Android有效解决图片问题

    以下是一些有效解决Android加载大图片内存溢出问题的方法: 1. **使用`BitmapFactory.decodeStream`代替`setImageBitmap`、`setImageResource`或`BitmapFactory.decodeResource`**: - `setImageBitmap`、`...

Global site tag (gtag.js) - Google Analytics