SkiaSharp是一个跨平台的2D图形库,适用于.NET应用程序,包括Windows Forms(WinForms)。在WinForms应用程序中使用SkiaSharp可以创建复杂的图形界面,实现高性能的绘图。本文介绍了如何在WinForms中使用SkiaSharp,包括一些常用属性和方法的示例。
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);
}
}
}
在这个示例中,我们创建了一个用于绘制文本的SKPaint
对象,并设置了颜色、抗锯齿、样式、对齐方式和文本大小。然后我们使用DrawText
方法在画布上绘制文本。
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);
}
}
在这个示例中,我们创建了一个名为SkiaSharpControl
的自定义控件,并在OnPaint
方法中使用SkiaSharp进行绘制。我们首先创建了一个SKSurface
,然后获取到SKCanvas
并在其上绘制一个圆形。最后,我们将SkiaSharp的绘制结果转换成WinForms可以处理的System.Drawing.Bitmap
,并使用Graphics.DrawImage
方法绘制到控件上。
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;
}
我们定义了一个ImageCropper
类,它有一个CropImage
方法,这个方法接受输入图像路径、输出图像路径和一个SKRectI
结构,表示要截取的区域。然后,我们使用SKBitmap.Decode
从文件加载原始图像,创建一个新的SKBitmap
来存放截取的部分,并使用SKCanvas
来绘制截取的图像。最后,我们将截取后的图像保存为PNG格式的文件。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!