Android-图像OutOfMemoryError的舍入

时间:2013-08-20 08:26:48

标签: android android-imageview

我有一个应用程序,要求我的图像是圆形的。原始图片 是正方形或矩形。此图像来自服务器。 我检索这些图像,然后在7张图像的图像视图中设置它应该是圆形的。

我在加载图片时使用了Universal Image Loader

这是舍入图像的方法。

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    final float roundPx = pixels;

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);

    return output;
} 

所以在UniversalImageLoader的onLoadingComplete()中, 我这样做了imageView.setImageBitMap(getRoundedCornerBitmap(bitmap, pixel))

它工作正常,但我不时得到OutofMemoryError。 我在Android-Universal-Image-Loader (github).

中找到了

Avoid using RoundedBitmapDisplayer. It creates new Bitmap object with ARGB_8888 config for displaying during work.

是否有其他方法可以实现图像的舍入而不必遭受OutOfMemoryError?

非常感谢任何帮助。

[更新]:这是我配置ImageLoader的方式。

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).denyCacheImageMultipleSizesInMemory()
                .memoryCache(new WeakMemoryCache())
                .discCache(new UnlimitedDiscCache(cacheDir))
                .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
                .defaultDisplayImageOptions(
                        new DisplayImageOptions.Builder()
                                .showStubImage(R.drawable.default_user)
                                .resetViewBeforeLoading()
                                .cacheOnDisc()
                                .bitmapConfig(Bitmap.Config.RGB_565)
                                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
                                .build())
                .tasksProcessingOrder(QueueProcessingType.FIFO)
                .imageDownloader(new HttpClientImageDownloader(context, new DefaultHttpClient(manager, params)))
                .threadPoolSize(2)
                .build();

        // Initialize ImageLoader with created configuration.
        imageLoader.init(config);

0 个答案:

没有答案