安卓:通用图片加载器 加载大图

5

我需要加载一张尺寸为2450 x 2450像素的大图片。

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(url,
        ImageConfig.getImageOptions());

问题在于,低端设备(内存小于1GB的手机)会出现内存不足的异常。

以下是我的DisplayImageOptions:

public static DisplayImageOptions getImageOptions() {
    DisplayImageOptions.Builder options = new DisplayImageOptions.Builder();
    options.delayBeforeLoading(10)
            //The reason I'm using ARGB_8888 because I need to load bitmap without losing it's quality
            .bitmapConfig(Bitmap.Config.ARGB_8888)
            .imageScaleType(ImageScaleType.NONE)
            //I'm not using disk or memory cache
            .cacheOnDisk(false)
            .cacheInMemory(false);
    return options.build();
}

我尝试根据设备分辨率添加目标大小,但它并没有起作用,加载的位图仍具有2450 x 2450像素的尺寸。

int height = orientation == Configuration.ORIENTATION_PORTRAIT ?
        displaymetrics.heightPixels : displaymetrics.widthPixels;

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(imageUri,
        new ImageSize(height, height), ImageConfig.getImageOptions());

我尝试将imageScaleType更改为ImageScaleType.EXACTLY,加载的位图调整大小为1225 x 1225像素,在所有设备上都需要获取高端设备的原始尺寸和低端设备的调整尺寸。

主要问题是目标大小不起作用。

有任何想法应该如何加载图像,特别是对于低端设备?


为什么你不使用缓存? - Akshay Mukadam
因为它不是必需的,即使使用缓存,在低端设备上仍然会出现内存不足异常。 - user2341387
在加载时调整图像大小。非常标准。 - greenapps
这就是我想要做的,但目标大小不像应该的那样工作。 - user2341387
2个回答

1
尝试使用一些类库,比如Picasso。它非常易于使用,并且可以为您管理调整大小。
如果您想自己完成此操作,我建议您在c++中使用NDK,因为那里有更好的内存管理,并且可以帮助您处理低端设备。

1

只需将 imageScaleType 更改为 ImageScaleType.EXACTLY_STRETCHED 即可解决问题。目标大小将按预期工作。奇怪的是,UIL 将尝试基于目标宽度和目标高度之间的最大值来维护纵横比。

DisplayImageOptions

public static DisplayImageOptions getImageOptions() {
    DisplayImageOptions.Builder options = new DisplayImageOptions.Builder();
    options.delayBeforeLoading(10)
        //The reason I'm using ARGB_8888 because I need to load bitmap without losing it's quality
        .bitmapConfig(Bitmap.Config.ARGB_8888)
        .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
        //I'm not using disk or memory cache
        .cacheOnDisk(false)
        .cacheInMemory(false);
    return options.build();
}

在加载位图时,根据设备尺寸设置目标大小

//In this case the device I'm using for testing has 2392 pixels height
int height = orientation == Configuration.ORIENTATION_PORTRAIT ?
        displaymetrics.heightPixels : displaymetrics.widthPixels;
//In this case the device I'm using for testing has 1440 pixels width
int width = orientation == Configuration.ORIENTATION_PORTRAIT ?
        displaymetrics.widthPixels : displaymetrics.heightPixels;

//Loaded bitmap will has 2392 x 2392 pixels dimensions
Bitmap bitmap = ImageLoader.getInstance().loadImageSync(imageUri,
        new ImageSize(width, height), ImageConfig.getImageOptions());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接