使用 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 可以做到这一点吗?
基本上你会做以下事情:
- 从图像文件创建 SKBitmap
- 从 SKBitmap 创建一个 SKShader
- 将您的 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
};
我能够渲染路径并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 可以做到这一点吗?
基本上你会做以下事情:
- 从图像文件创建 SKBitmap
- 从 SKBitmap 创建一个 SKShader
- 将您的 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
};