【问题标题】:Blurred imageview after zooming while using Universal Image Loader in android在android中使用通用图像加载器缩放后图像视图模糊
【发布时间】:2012-09-19 23:44:17
【问题描述】:

我想在水平浏览器中显示一组图像。我使用了通用图像加载器一切都很好。但是缩放后,即使是大图像,图像质量也会下降。

图片大小为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);

【问题讨论】:

  • 能否请您与我分享您在 ViewPager 中用于缩放图像的库是什么?我尝试了 PhotoView,但它经常在缩放时崩溃。

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


【解决方案1】:

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();
                }
            }
        }
        ...
    }
    

【讨论】:

  • :非常感谢谢尔盖先生。它正在工作。现在应用程序变得非常缓慢并且经常出现以下错误。内存不足错误。位图大小超出 VM 预算。任何帮助谢尔盖
  • 编辑了我的答案(关于ImageScaleType.EXACT.threadPoolSize(1))。试试看。
  • 很棒的谢尔盖。非常感谢您节省了我的时间,谢尔盖
  • 抱歉谢尔盖还是OOM来了
  • 在我的答案中添加了信息(关于适配器)。试试看。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2017-04-07
  • 2014-10-21
  • 1970-01-01
  • 2016-06-23
  • 2012-01-31
相关资源
最近更新 更多