使用 Xamarin.Forms 和 SkiaSharp,是否可以使用图像而不是颜色来 stroke/fill 路径?

Using Xamarin.Forms and SkiaSharp, is it possible to use an image rather than a color to stroke/fill a path?

我能够渲染路径并stroke/fill它具有纯色:

        SKPaint green = new SKPaint
        {
            Style = SKPaintStyle.StrokeAndFill,
            Color = SKColors.LimeGreen,                 
            StrokeWidth = 1,
            IsAntialias = true
        };

        canvas.Clear();
        SKPath path = new SKPath();

        // here I define my path

        canvas.DrawPath(path, green);

但是,如果我想使用小 PNG 作为 stroke/fill 的“纹理”而不是颜色怎么办?例如,如果我有一个绿色 grass/lawn 的小 PNG 文件,我想用这个 PNG 作为纹理填充路径?在旧的 Xamarin.iOS 世界中,这很容易做到。

使用 SkiaSharp 可以做到这一点吗?

我在 https://social.msdn.microsoft.com/Forums/en-US/9647627e-029d-4b63-bfb6-a247deee1bef/is-there-a-way-to-hatch-fill-a-rectangle?forum=xamarinlibraries 找到了答案。

基本上你会做以下事情:

  1. 从图像文件创建 SKBitmap
  2. 从 SKBitmap 创建一个 SKShader
  3. 将您的 SKPaint 的“着色器”属性 分配给 #2

示例:

        // Load bitmap
        string resourceID = "myImage.png";
        Assembly assembly = GetType().GetTypeInfo().Assembly;

        SKBitmap bitmap;
        using (Stream stream = assembly.GetManifestResourceStream(resourceID))
        {
            bitmap = SKBitmap.Decode(stream);
        }

        // Create the SKShader
        SKShader shader = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat);

        // Create SKPaint
        SKPaint myPaint = new SKPaint
        {
            Style = SKPaintStyle.StrokeAndFill,
            Shader = shader
        };