什么是将位图转换为圆形位图的最佳方法

时间:2018-04-24 08:59:01

标签: java c# android image-processing bitmap

我试图转换一个"矩形"位图为带边框的圆形图。我写了这段代码:

using Android.Graphics;
namespace MyNamespace
{
 public static class BitmapExtension
 {
    public static Bitmap GetCircularBitmap(this Bitmap bitmap)
    {
        Bitmap result = Bitmap.CreateBitmap(bitmap.Width, bitmap.Height, Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(result);

        Paint paint = new Paint();
        Rect rect = new Rect(0, 0, bitmap.Width, bitmap.Height);

        paint.AntiAlias = true;
        canvas.DrawARGB(0, 0, 0, 0);
        paint.Color = Color.Black;
        canvas.DrawCircle(bitmap.Width / 2, bitmap.Height / 2, bitmap.Width / 2, paint);
        paint.SetXfermode(new PorterDuffXfermode(PorterDuff.Mode.SrcIn));
        canvas.DrawBitmap(bitmap, rect, rect, paint);

        // Border
        paint.SetStyle(Paint.Style.Stroke);
        paint.StrokeWidth = 2;
        paint.AntiAlias = true;

        canvas.DrawCircle(
                canvas.Width / 2,
                canvas.Width / 2,
                canvas.Width / 2 - 2 / 2,
                paint);

        // Release pixels on original bitmap.
        bitmap.Recycle();

        return result;
    }               
 }
}

到目前为止,这种方法效果很好,因为这个代码在RecyclerView中使用,有时它只是没有正确绘制:

Image draw out of place.

正如您所看到的,图像略微不合适。所以我有两个问题:

  1. 是什么导致这种奇怪的行为发生?
  2. 有没有办法改进我的 GetCircularBitmap 方法?由于性能很重要,因此必须非常快。
  3. 更新:解决方案

    我使用FFImageLoadingCircle Transformation来显示我的图像。它还大大提高了性能,并为图像缓存提供了良好的实践。

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用CircleImageView

首先将此添加到你的gradle文件:

dependencies { ... implementation 'de.hdodenhof:circleimageview:2.2.0' }

在XML布局中:

<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/image"
android:layout_width="24"
android:layout_height="24"
android:src="@drawable/image"/>

在您的Java代码中,您可以像使用任何其他ImageView一样使用它。