1

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

我使用通用图像加载器来加载我的图像。

这是对我的图像进行四舍五入的方法。

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

所以在onLoadingComplete()UniversalImageLoader 中,我这样做了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);
4

0 回答 0