SkiaSharp C# 描画研究

SkiaSharp は、Google の Skia グラフィックス ライブラリの .NET ラッパーであり、モバイル、サーバー、およびデスクトップ プラットフォームで 2D グラフィックスを描画するために使用できます。SkiaSharp は、ハードウェア アクセラレーションによるレンダリングのために OpenGL と共に使用できます。SkiaSharp は、もともと Mono によって開発されましたが、現在は Microsoft によって管理され、MIT ライセンスの下で利用できます。
SkiaSharp を使用してクロスプラットフォームの使用を実現し、Windows、Linux、Anroid、IOS、および WebAssembly での使用をサポートします。ソースコード自体はC++コードで、パッケージング後の多言語開発にも対応。

SkiaCharp の基本的な使い方

  1. WinForm プログラムを作成する
  2. nuget を使用して SkiaSharp、SkiaSharp.Views.WindowsForms、SkiaSharp.Extended ライブラリをインストールし、そのバージョン番号は依存関係エラーを防ぐために対応する必要があります (WPF にも同様のライブラリがあります)。
  3. ツールボックスのインターフェイスに skControl を追加します。

画像.png

using SkiaSharp;

namespace WinFormsApp1
{
    
    
    public partial class Form1 : Form
    {
    
    
        public Form1()
        {
    
    
            InitializeComponent();
        }

        private void skControl1_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e)
        {
    
    
           var canvas= e.Surface.Canvas;
            SKPaint paint = new SKPaint
            {
    
    
                Style = SKPaintStyle.Stroke,
                Color = SKColors.Red,
                StrokeWidth=2,
                //设置抗锯齿
                IsAntialias = true,
            };
            //设置虚实线;
            float[] dash_param = {
    
     5F, 3F };
            SKPathEffect dashes = SKPathEffect.CreateDash(dash_param, 0);
            paint.PathEffect = dashes;
            

            SKPaint fill_paint = new SKPaint
            {
    
    
                Style = SKPaintStyle.Fill,
                Color = new SKColor(255,0,0,125),
                StrokeWidth = 10

            };
            canvas.Clear(new SKColor(100, 100, 100, 125));
            canvas.DrawLine(0, 0, 200, 200, paint);
            
            canvas.DrawRect(0, 0, 500, 500, fill_paint);

            SKPaint text_paint = new SKPaint
            {
    
    
                FakeBoldText = true,
                TextSize = 50,
                Color = SKColors.Green,
                TextAlign = SKTextAlign.Center,
                //宋体,不然不支持中文绘制;
                Typeface = SKTypeface.FromFamilyName("SimSun")

            };
            canvas.Save();
            //逆时针旋转45度绘制
            canvas.RotateDegrees(-45, 250, 250);
            canvas.DrawText("我是中国人", new SKPoint(250, 250), text_paint);
            canvas.Restore();
        }
    }
}

見せる

画像.png

Canvas コンテンツを画像、PDF、SVG、その他のデバイスに描画する

//创建基于PDF、SVG、PNG的绘图文件.
public SKCanvas createFile(string file_name, int width, int height, StoreType store_type)
{
    
    
    var wStream = new SKFileWStream(file_name);

    if (store_type == StoreType.StoreSvg)
    {
    
    
        return SKSvgCanvas.Create(SKRect.Create(width, height), wStream);
    }
    else if (store_type == StoreType.StorePDF)
    {
    
    
         var _pdf_doc = SKDocument.CreatePdf(wStream);
        _pdf_doc.BeginPage(width, height);
        return pdf_doc;
    }
    else if (store_type == StoreType.StorePng)
    {
    
    
       return SKSurface.CreateNull(width, height);
    }
    return NULL;
}
//将内容绘制到图片上,创建基于图片的canvas即可;
public SKCanvas GetCanvas(SKBitmap bitmap)
{
    
    
    return  new SKCanvas(bitmap);
}

//将数据绘制到内存上,并直接进行到各自的类型文件中
public SKCanvas createStream(MemoryStream memStream, int width, int height, XDICanvas.StoreType store_type)
{
    
    

    SKManagedWStream wstream = new SKManagedWStream(memStream);

    if (store_type == StoreType.StoreSvg)
    {
    
    
        return SKSvgCanvas.Create(SKRect.Create(width, height), wstream);
    }
    else if (store_type == StoreType.StorePDF)
    {
    
    
        var _pdf_doc = SKDocument.CreatePdf(wstream);
        var file_canvas = _pdf_doc.BeginPage(width, height);
         return file_canvas;
    }
    return true;
}

Skia 経由で Svg ダイアグラムを読み取る

デフォルトでは、SkiaSharp は C++ 最下層の拡張機能でもある SVG の読み取り機能を提供せず、C# のSvg.SkiaライブラリSvg 画像を処理します。

public void DrawSvg(SKCanvas canvas,string svg_data)  //svg的字符串
{
    
    
		SvgDocument svgDocument;
#if NETFOR60
        svgDocument=SvgExtensions.FromSvg(svg_data);
#else    
            //低版本的使用方式;
        svgDocument = SvgDocument.FromSvg<SvgDocument>(svg_data);
#endif
            
        var rect = new XDRect(0, 0, svgDocument.Width.Value, svgDocument.Height.Value);
        SKSvg svg = new SKSvg();
       
        var picture = svg.FromSvgDocument(svgDocument);

        canvas.DrawPicture(picture):
             
}

Skia を使用して、テキストの自動改行の問題を解決する方法

デフォルトでは、Skia ライブラリはテキストの自動改行ソリューションを直接提供しておらず、自分で記述するのは比較的困難です。SkiaTextRendererワードラップの問題を解決できるオープンソースのライブラリが既に存在することがわかりました.このライブラリは中国語と英語の単語を自動的に処理する機能を提供します.以下はそのテスト例の結果です.

画像.png

SKBitmapやBitmapなどのオブジェクトの相互変換について

C# を非常に使いやすくしている理由の 1 つは、C# には多くの既存のソリューションが用意されていることです。SKBitmap、SKImage、System.Drawing などのオブジェクトでの SKia の変換は、いくつかの既存のライブラリを提供しており、SkiaSharp.Views.Desktop.Commonライブラリは関連する変換ソリューションを提供します。

画像.png

おすすめ

転載: blog.csdn.net/qq_33377547/article/details/126691992