Xamarin 表单(android 项目)使用 Skia 图形库渲染图像时出错
Xamarin forms (android project) error rendering image using Skia graphics library
我正在尝试在我的 xamarin 表单解决方案中使用 skia 图形库加载和渲染图像。当我尝试渲染图像(运行 android 项目)时,出现以下错误:
Value cannot be null. Parameter name: codec
代码如下:
void OnPainting(object sender, SKPaintSurfaceEventArgs e)
{
var surface = e.Surface;
var canvas = surface.Canvas;
canvas.Clear(SKColors.White);
var filename = "test.jpg";
using (var stream = new SKFileStream(filename))
using (var bitmap = SKBitmap.Decode(stream)) // the error occurs on this line
using (var paint = new SKPaint())
{
canvas.DrawBitmap(bitmap, SKRect.Create(200, 200), paint);
}
}
我在网上找不到任何 xamarin 的示例代码。任何示例代码或链接将不胜感激。
提前致谢
Value cannot be null. Parameter name: codec
我认为您可能在此处得到一个空对象:using (var stream = new SKFileStream(filename))
。我试着创建了一个演示,它运行良好。
XAML:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:skiaviews="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
x:Class="FormsIssue6.Page1">
<Grid>
<skiaviews:SKCanvasView x:Name="mycanvas" PaintSurface="OnPainting" />
</Grid>
</ContentPage>
后面的代码:
private void OnPainting(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
{
var surface = e.Surface;
var canvas = surface.Canvas;
var assembly = typeof(Page1).GetTypeInfo().Assembly;
var fileStream = assembly.GetManifestResourceStream("YOUR-FILE-FULL-NAME");
// clear the canvas / fill with white
canvas.DrawColor(SKColors.White);
// decode the bitmap from the stream
using (var stream = new SKManagedStream(fileStream))
using (var bitmap = SKBitmap.Decode(stream))
using (var paint = new SKPaint())
{
// create the image filter
using (var filter = SKImageFilter.CreateBlur(5, 5))
{
paint.ImageFilter = filter;
// draw the bitmap through the filter
canvas.DrawBitmap(bitmap, SKRect.Create(640, 480), paint);
}
}
}
上面代码中的文件名应该是"YOUR PROJECT NAMESPACE"."File NAME",这个文件放在PCL中,这个文件的build action必须是"Embedded Resource".有关使用文件的更多信息,您可以参考 Files.
I cannot find any sample code online for xamarin. Any sample code or links would be much appreciated.
Github上的包本身有Xamarin.Forms的代码示例,你可以参考FormsSample。
我正在尝试在我的 xamarin 表单解决方案中使用 skia 图形库加载和渲染图像。当我尝试渲染图像(运行 android 项目)时,出现以下错误:
Value cannot be null. Parameter name: codec
代码如下:
void OnPainting(object sender, SKPaintSurfaceEventArgs e)
{
var surface = e.Surface;
var canvas = surface.Canvas;
canvas.Clear(SKColors.White);
var filename = "test.jpg";
using (var stream = new SKFileStream(filename))
using (var bitmap = SKBitmap.Decode(stream)) // the error occurs on this line
using (var paint = new SKPaint())
{
canvas.DrawBitmap(bitmap, SKRect.Create(200, 200), paint);
}
}
我在网上找不到任何 xamarin 的示例代码。任何示例代码或链接将不胜感激。
提前致谢
Value cannot be null. Parameter name: codec
我认为您可能在此处得到一个空对象:using (var stream = new SKFileStream(filename))
。我试着创建了一个演示,它运行良好。
XAML:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:skiaviews="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
x:Class="FormsIssue6.Page1">
<Grid>
<skiaviews:SKCanvasView x:Name="mycanvas" PaintSurface="OnPainting" />
</Grid>
</ContentPage>
后面的代码:
private void OnPainting(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
{
var surface = e.Surface;
var canvas = surface.Canvas;
var assembly = typeof(Page1).GetTypeInfo().Assembly;
var fileStream = assembly.GetManifestResourceStream("YOUR-FILE-FULL-NAME");
// clear the canvas / fill with white
canvas.DrawColor(SKColors.White);
// decode the bitmap from the stream
using (var stream = new SKManagedStream(fileStream))
using (var bitmap = SKBitmap.Decode(stream))
using (var paint = new SKPaint())
{
// create the image filter
using (var filter = SKImageFilter.CreateBlur(5, 5))
{
paint.ImageFilter = filter;
// draw the bitmap through the filter
canvas.DrawBitmap(bitmap, SKRect.Create(640, 480), paint);
}
}
}
上面代码中的文件名应该是"YOUR PROJECT NAMESPACE"."File NAME",这个文件放在PCL中,这个文件的build action必须是"Embedded Resource".有关使用文件的更多信息,您可以参考 Files.
I cannot find any sample code online for xamarin. Any sample code or links would be much appreciated.
Github上的包本身有Xamarin.Forms的代码示例,你可以参考FormsSample。