Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将位图转换为圆形位图的最佳方法是什么_Java_C#_Android_Image Processing_Bitmap - Fatal编程技术网

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

Java 将位图转换为圆形位图的最佳方法是什么,java,c#,android,image-processing,bitmap,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, bi

我正在尝试将“矩形”位图转换为带边框的圆形位图。我写了这段代码:

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中使用,有时它画得不对:

如您所见,图像的绘制有点不合适。所以我有两个问题:

  • 是什么导致这种奇怪的行为发生的
  • 有没有办法改进我的GetCircularBitmap方法?因为性能很重要,所以它必须非常快
  • 更新:解决方案


    我使用了与a一起显示我的图像。它还大大提高了性能,为图像缓存提供了良好的实践。

    最简单的方法是使用

    首先将其添加到yout gradle文件:

    依赖项{
    ...
    实现“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一样使用它。

    最简单的方法是使用

    首先将其添加到yout gradle文件:

    依赖项{
    ...
    实现“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一样使用它。

    谢谢,我会尝试一下,因为在性能问题上,我对第三方库有点怀疑。我在RecyclerView中使用过,没有遇到任何问题。但也许你可以看看GitHub repo中的代码?我试过了。对于其他应用程序来说,这可能是一个很好的解决方案,但由于我正在以异步方式将图像加载到CircleImageView中,并在返回时使用SetImageBitmap,因此无法实现。在代码从异步请求返回后,图像不会显示(但是它与我在starter post中发布的代码一起工作)。您从哪里加载图像?如果您是从web加载图像,我会说使用毕加索是最好的方法。您不必担心异步任务或加载程序。谢谢,我会尝试一下,因为在性能问题上,我对第三方库有点怀疑。我在RecyclerView中使用过,没有遇到任何问题。但也许你可以看看GitHub repo中的代码?我试过了。对于其他应用程序来说,这可能是一个很好的解决方案,但由于我正在以异步方式将图像加载到CircleImageView中,并在返回时使用SetImageBitmap,因此无法实现。在代码从异步请求返回后,图像不会显示(但是它与我在starter post中发布的代码一起工作)。您从哪里加载图像?如果您是从web加载图像,我会说使用毕加索是最好的方法。您不必担心异步任务或加载程序。第二个结果不是因为第二个图像不是正方形吗?你只需要从切掉它的中心正方形开始,然后使用它。第二个结果不是因为第二个图像不是正方形吗?你只需要从切下它的中心正方形开始,然后使用它。