而使用Android的通用图像装载机放大后模糊的ImageView [英] Blurred imageview after zooming while using Universal Image Loader in android

查看:273
本文介绍了而使用Android的通用图像装载机放大后模糊的ImageView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要显示设置在水平viewpager图像。我已经使用了通用图像装载机一切都是fine.But缩放,图像质量甚至为大图像丢失。在

图像的尺寸为1000×1000

我已经配置了以下设置

 选项选项=新DisplayImageOptions.Builder()
        .showImageForEmptyUri(R.drawable.ic_launcher)
        .cacheOnDisc()
        .cacheInMemory()
        .imageScaleType(ImageScaleType.POWER_OF_2)
        。建立();

配置=新ImageLoaderConfiguration.Builder(CTX)
        .defaultDisplayImageOptions(选项)
        。建立();
。ImageLoader.getInstance()的init(配置);
 

解决方案

通用图像装载机不断减少图像在内存中以节省内存。每一个缩小图像的尺寸计算,它依赖于目标ImageView的彩色图片(的android:layout_width 安卓layout_height 安卓了maxWidth 安卓了maxHeight 参数,安卓scaleType ,设备的屏幕尺寸都考虑)。

在默认情况下的最大目标大小为每个图像设备的屏幕大小。所以,你有类似设备的屏幕尺寸大小的图像,当你放大你看到质量不好。

所以,你应该在ImageView的全尺寸图像加载(缩放支持,没有质量损失)。 在内存中设置自己的最大大小的缓存图片

  ImageLoaderConfiguration配置=新ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(1200,1000)//最大宽度和图像的高度
        ...
        。建立();
 

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

以preVENT OOM:

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

     私有类ImagePagerAdapter扩展PagerAdapter {
        ...
        @覆盖
            公共无效destroyItem(View容器,INT位置,Object对象){
            查看查看=(查看)对象;
            ((ViewPager)容器).removeView(视图);
            ImageView的ImageView的=(ImageView的)view.findViewById(R.id.image);
            BitmapDrawable BD =(BitmapDrawable)imageView.getDrawable();
            如果(BD!= NULL){
                BMP位= bd.getBitmap();
                如果(BMP!= NULL){
                    bmp.recycle();
                }
            }
        }
        ...
    }
     

I want to display set of images in horizontal viewpager .I have used the Universal Image Loader Everything is fine.But after zooming, quality of images have lost even for big images.

The Size of image is 1000*1000

I have configured with the following settings

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);

解决方案

Universal Image Loader keeps reduced images in memory to save memory. Size of every reduced image is calculated and it depends on target ImageView for this image (android:layout_width, android:layout_height, android:maxWidth, android:maxHeight parameters, android:scaleType, device screen size are considered).

By default maximum target size for every image is device's screen size. So you have images of size similar to device screen size and when you zooming you see bad quality.

So you should load in ImageView full-sized images (for zooming support without quality loss). Set your own maximum size for cached images in memory:

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

In this case you will load large Bitmaps in memory so I recommend not to cache them in memory. Disable memory caching for these images (don't call .cachenMemory() in DisplayImageOptions) and set .imageScaleType(ImageScaleType.EXACT). You can disable them globally (in .defaultDisplayImageOptions(...)) or for every display task (imageLoader.displayImage(...))

TO PREVENT OOM:

  1. Disable memory caching for these images (don't call .cachenMemory() in DisplayImageOptions)
  2. Set .imageScaleType(ImageScaleType.EXACT)
  3. Set .threadPoolSize(1) (as last try)
  4. Recycle Bitmaps in adapter:

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

这篇关于而使用Android的通用图像装载机放大后模糊的ImageView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆