编辑
2025-09-29
C#
00

目录

摘要
正文
nuget 安装SkiaSharp
示例1:处理文本
示例2:创建自定义控件并绘制形状
示例3:截取图片

摘要

SkiaSharp是一个跨平台的2D图形库,适用于.NET应用程序,包括Windows Forms(WinForms)。在WinForms应用程序中使用SkiaSharp可以创建复杂的图形界面,实现高性能的绘图。本文介绍了如何在WinForms中使用SkiaSharp,包括一些常用属性和方法的示例。

正文

nuget 安装SkiaSharp

image.png

示例1:处理文本

C#
private void DrawText(SKCanvas canvas) { // 创建文本画笔 var textPaint = new SKPaint { Color = SKColors.Blue, IsAntialias = true, Style = SKPaintStyle.Fill, TextAlign = SKTextAlign.Center, TextSize = 24 }; // 绘制文本 canvas.DrawText("Hello SkiaSharp", this.Width / 2, this.Height / 2, textPaint); }
C#
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var info = new SKImageInfo(this.Width, this.Height); using (var surface = SKSurface.Create(info)) { // 获取SKCanvas对象 SKCanvas canvas = surface.Canvas; DrawText(canvas); // 将SkiaSharp绘制的内容绘制到WinForms控件上 using (var image = surface.Snapshot()) using (var data = image.Encode(SKEncodedImageFormat.Png, 100)) using (var stream = data.AsStream()) { var bitmap = new System.Drawing.Bitmap(stream); e.Graphics.DrawImage(bitmap, 0, 0); } } }

image.png

在这个示例中,我们创建了一个用于绘制文本的SKPaint对象,并设置了颜色、抗锯齿、样式、对齐方式和文本大小。然后我们使用DrawText方法在画布上绘制文本。

示例2:创建自定义控件并绘制形状

C#
public class SkiaSharpControl : Control { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 获取控件的宽度和高度 int width = this.Width; int height = this.Height; // 创建SKImageInfo和SKSurface var info = new SKImageInfo(width, height); using (var surface = SKSurface.Create(info)) { // 获取SKCanvas对象 SKCanvas canvas = surface.Canvas; // 清除画布 canvas.Clear(SKColors.Transparent); // 进行绘制 DrawShapes(canvas); // 将SkiaSharp绘制的内容绘制到WinForms控件上 using (var image = surface.Snapshot()) using (var data = image.Encode(SKEncodedImageFormat.Png, 100)) using (var stream = data.AsStream()) { var bitmap = new System.Drawing.Bitmap(stream); e.Graphics.DrawImage(bitmap, 0, 0); } } } private void DrawShapes(SKCanvas canvas) { // 创建画笔 var paint = new SKPaint { IsAntialias = true, Color = SKColors.Blue, Style = SKPaintStyle.Fill }; // 绘制一个圆 canvas.DrawCircle(this.Width / 2, this.Height / 2, 40, paint); } }

image.png

在这个示例中,我们创建了一个名为SkiaSharpControl的自定义控件,并在OnPaint方法中使用SkiaSharp进行绘制。我们首先创建了一个SKSurface,然后获取到SKCanvas并在其上绘制一个圆形。最后,我们将SkiaSharp的绘制结果转换成WinForms可以处理的System.Drawing.Bitmap,并使用Graphics.DrawImage方法绘制到控件上。

示例3:截取图片

C#
public class ImageCropper { /// <summary> /// 截取图像的一部分并保存到指定路径。 /// </summary> /// <param name="inputPath">输入图像的路径。</param> /// <param name="outputPath">输出图像的路径。</param> /// <param name="cropArea">要截取的区域。</param> public void CropImage(string inputPath, string outputPath, SKRectI cropArea) { // 确保输入文件存在 if (!File.Exists(inputPath)) { throw new FileNotFoundException("输入的图像文件未找到。", inputPath); } // 从文件读取图像 using (var inputStream = File.OpenRead(inputPath)) using (var originalBitmap = SKBitmap.Decode(inputStream)) { // 检查截取区域是否在原图范围内 var ret = SKRectI.Intersect(cropArea, new SKRectI(0, 0, originalBitmap.Width, originalBitmap.Height)); // 确保截取区域在图像范围内 if (ret.IsEmpty || ret.Width<0 || ret.Height<0) { MessageBox.Show("截取区域超出了图像的边界。"); return; } // 创建一个新的位图,用于存放截取的图像部分 using (var croppedBitmap = new SKBitmap(cropArea.Width, cropArea.Height)) { // 使用SKCanvas进行图像截取 using (var canvas = new SKCanvas(croppedBitmap)) { // 清除画布 canvas.Clear(SKColors.Transparent); // 设置截取的源区域和目标区域 var sourceRect = cropArea; var destRect = new SKRect(0, 0, cropArea.Width, cropArea.Height); // 绘制截取的图像 canvas.DrawBitmap(originalBitmap, sourceRect, destRect); } // 保存截取后的图像 using (var outputStream = File.OpenWrite(outputPath)) using (var image = SKImage.FromBitmap(croppedBitmap)) using (var data = image.Encode(SKEncodedImageFormat.Png, 100)) { data.SaveTo(outputStream); } } } } }
C#
private void Form1_Load(object sender, EventArgs e) { var imageCropper = new ImageCropper(); // 输入和输出图像路径 string inputImagePath = "./feGsv0kJ6CEBng3.png"; string outputImagePath = "./1.png"; // 定义要截取的区域(例如:从(50, 50)开始,宽度和高度都是100像素) SKRectI cropArea = new SKRectI(0, 0, 150, 150); // 执行截图操作 imageCropper.CropImage(inputImagePath, outputImagePath, cropArea); pictureBox1.Image = Image.FromFile(outputImagePath); pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; }

image.png

我们定义了一个ImageCropper类,它有一个CropImage方法,这个方法接受输入图像路径、输出图像路径和一个SKRectI结构,表示要截取的区域。然后,我们使用SKBitmap.Decode从文件加载原始图像,创建一个新的SKBitmap来存放截取的部分,并使用SKCanvas来绘制截取的图像。最后,我们将截取后的图像保存为PNG格式的文件。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!