【问题标题】:Xamarin forms (android project) error rendering image using Skia graphics library使用 Skia 图形库的 Xamarin 表单(android 项目)错误渲染图像
【发布时间】:2017-07-28 11:01:20
【问题描述】:

我正在尝试使用我的 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 的示例代码。任何示例代码或链接将不胜感激。

提前致谢

【问题讨论】:

    标签: xamarin xamarin.android xamarin.forms skia skiasharp


    【解决方案1】:

    值不能为空。参数名称:编解码器

    我认为你有可能在这里得到一个空对象: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中,这个文件的构建动作必须是"Embedded Resource"。有关使用文件的更多信息,您可以参考Files

    我在网上找不到任何适用于 xamarin 的示例代码。任何示例代码或链接将不胜感激。

    Github 上的包本身有 Xamarin.Forms 的代码示例,可以参考FormsSample

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2010-10-29
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多