Android:将大型图像从存储加载到ImageView

时间:2015-10-15 10:03:05

标签: android image imageview android-imageview picasso

我正在做一个画廊形象。我在设备中获取图像路径并解析为URI。 然后我使用Picasso Android Lib将图像加载到Imageview中的Gridview。它有效,直到有一个大图像。毕加索无法加载大图像。我收到错误Out Of Memory。是否有任何建议将大图片加载到ImageView?有任何lib可以将图像加载到ImageView而不是Picasso吗?

4 个答案:

答案 0 :(得分:1)

我为我的问题找到了ImageLoader lib。它工作正常。我测试了我的项目,然后我看到ImageLoader看起来比Picasso好。

答案 1 :(得分:0)

了解如何使用常用技术来处理和加载Bitmap对象,使用户界面(UI)组件保持响应并避免超出应用程序内存限制。如果您不小心,位图可能会快速消耗您的可用内存预算,从而导致应用程序崩溃,因为可怕的异常: java.lang.OutofMemoryError:位图大小超过VM预算。

为什么在Android应用程序中加载位图很棘手有很多原因:

移动设备通常具有受限制的系统资源。 Android设备可以为单个应用程序提供少至16MB的内存。 Android兼容性定义文档(CDD),第3.7节。虚拟机兼容性为各种屏幕尺寸和密度提供所需的最小应用程序内存。应优化应用程序以在此最小内存限制下执行。但是,请记住,许多设备配置了更高的限制。

Bitmaps会占用大量内存,尤其是对于像照片这样的丰富图像。例如,Galaxy Nexus上的相机拍摄的照片最高可达2592x1936像素(5百万像素)。如果使用的位图配置是ARGB_8888(默认情况下从Android 2.3开始),则将此图像加载到内存中需要大约19MB的内存(2592 * 1936 * 4字节),这会立即耗尽某些设备上的每个应用程序限制。 Android应用UI通常需要一次加载几个位图。 ListView,GridView和ViewPager等组件通常会同时在屏幕上显示多个位图,并且可以在屏幕上轻松显示更多可能的屏幕外显示。

Read More Regarding this issue

答案 2 :(得分:0)

这是我曾经使用的一个例子,但它并不完美! (对不起)

您可以缩小位图大小:

public Bitmap resizeBitmap(Bitmap bitmap) {
    if (bitmap.getHeight() > 4096 || bitmap.getWidth() > 4096) {
        int width = (int) (bitmap.getWidth() * 0.9);
        int height = (int) (bitmap.getHeight() * 0.9);
        Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);

        resizeBitmap(resizedBitmap);
        returnresizedBitmap;
    } else {
        return bitmap;
    }
}

如果我应该再做一次:(未经测试)

public Bitmap resizeBitmap(Bitmap bitmap) {
    int originalWidth = bitmap.getWidth();
    int originalHeight = bitmap.getHeight();

    if (originalWidth > 4096 || originalHeight  > 4096) {

        int height;
        int width;

        if(originalHeight > originalWidth) {
            height = 4096;
            width  = originalWidth  / (originalHeight / 4096);
        } else {
            width  = 4096;
            height = originalHeight / (originalWidth / 4096);
        }

        Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);

        return resizedBitmap;
    } else {
        return bitmap;
    }
}

答案 3 :(得分:0)

您可以为您的目的自定义recent-images库。它非常简单易用。它会创建一个图像缩略图,以便在gridview中显示,然后在单击中打开原始图像。