在android中使用通用图像加载器进行缩放后模糊的imageview

时间:2012-09-28 05:29:31

标签: android image-processing universal-image-loader

我想在水平viewpager中显示一组图像。我使用了Universal Image Loader一切都很好。但是在缩放后,即使对于大图像,图像质量也会丢失。

图像尺寸为1000 * 1000

我已使用以下设置进行配置

Options options = new DisplayImageOptions.Builder()
        .showImageForEmptyUri(R.drawable.ic_launcher)
        .cacheOnDisc()
        .cacheInMemory()
        .imageScaleType(ImageScaleType.POWER_OF_2)
        .build();

config = new ImageLoaderConfiguration.Builder(ctx)
        .defaultDisplayImageOptions(options)
        .build();
ImageLoader.getInstance().init(config);

1 个答案:

答案 0 :(得分:6)

Universal Image Loader将缩小的图像保存在内存中以节省内存。计算每个缩小图像的大小,它取决于此图像的目标ImageView(android:layout_widthandroid:layout_heightandroid:maxWidthandroid:maxHeight参数,android:scaleType,设备屏幕考虑尺寸)。

默认情况下,每张图片的最大目标尺寸是设备的屏幕尺寸。因此,您的图像尺寸与设备屏幕尺寸相似,当您缩放时,您会发现质量不佳。

因此,您应该加载ImageView全尺寸图像(用于缩放支持而不会丢失质量)。 为内存中的缓存图片设置自己的最大尺寸

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(1200, 1000) // maximum width and height of your images
        ...
        .build();

在这种情况下,您将在内存中加载大型位图,因此我建议不要将它们缓存在内存中。禁用这些图像的内存缓存(不要在DisplayImageOptions中调用.cachenMemory())并设置.imageScaleType(ImageScaleType.EXACT)。您可以全局(.defaultDisplayImageOptions(...))或每个显示任务(imageLoader.displayImage(...)

禁用它们

预防OOM:

  1. 禁用这些图片的内存缓存(不要在DisplayImageOptions中调用.cachenMemory()
  2. 设置.imageScaleType(ImageScaleType.EXACT)
  3. 设置.threadPoolSize(1)(最后一次尝试)
  4. 在适配器中回收位图:

    private class ImagePagerAdapter extends PagerAdapter {
        ...
        @Override
            public void destroyItem(View container, int position, Object object) {
            View view = (View) object;
            ((ViewPager) container).removeView(view);
            ImageView imageView = (ImageView) view.findViewById(R.id.image);
            BitmapDrawable bd = (BitmapDrawable) imageView.getDrawable();
            if (bd != null) {
                Bitmap bmp = bd.getBitmap();
                if (bmp != null) {
                    bmp.recycle();
                }
            }
        }
        ...
    }