使用skiasharp在c#中生成图像
在本文中,我们将学习如何使用 skiasharp 在 c# 中生成图像。
什么是 skiasharp?
skiasharp 库是一个适用于 .net 平台的跨平台 2d 图形 api,它基于 google 的 skia graphics 库,后者是一个用于绘制文本、几何图形和图像的综合库。该库是 google chrome、chromeos、android 和 flutter 等各种 google 产品中使用的图形引擎。
在本文中,我们将探索使用 skiasharp 创建一个空白图像,然后在创建的图像中间绘制一个正方形。
让我们首先在终端上导航到我们的项目目录来导入 nuget 包:
创建图像
接下来,让我们创建一个imageservice静态类,在其中定义一些辅助方法,首先创建一个空白图像
public static skbitmap createblankimage(int width, int height) { var bitmap = new skbitmap(width, height); using var canvas = new skcanvas(bitmap); canvas.clear(skcolors.white); return bitmap; }
这里我们看到了静态方法的定义createblankimage(),它接受width和height作为参数并返回一个bitmap类型skbitmap,它代表 skiasharp 中的图像。
我们首先使用skbitmap给定的width和创建一个对象height。然后,我们skcanvas使用初始化一个新对象skbitmap。这样,我们将画布链接到位图。该类skcanvas表示 skiasharp 中的画布或绘图表面。它提供绘制图形、文本和图像的方法。
当我们最初创建位图时,其像素数据由未定义的随机值组成。在使用构造函数将位图附加到画布时skcanvas(),我们创建了一种操作图像像素数据的方法。如果没有画布,位图将保持未初始化的随机值。
请注意,skcanvas对象是可丢弃的,因此添加了使用声明以确保正确清理。
接下来,我们使用方法清除整个画布skcanvas.clear(skcolor)。该clear()方法将画布内的所有像素设置为单一颜色,在我们的例子中为skcolors.white。如果我们调用无参数重载,clear()所有像素将设置为skcolor.empty(#00000000)。
处理图像
现在,让我们创建一个方法在图像的中心绘制一个正方形:
public static void drawsquareonimage(skbitmap bitmap, int squaresize, int startx, int starty) { if (squaresize <= 0 || startx <= 0 || starty <= 0) { throw new argumentexception("square size and coordinates must be greater than zero."); } using var canvas = new skcanvas(bitmap); using var paint = new skpaint(); paint.color = skcolors.red; var square = new skrect(startx, starty, startx + squaresize, starty + squaresize); canvas.drawrect(square, paint); }
这里我们定义了一个drawsquareonimage()方法,它将在提供的图像上绘制一个正方形。它有四个参数,即skbitmap我们将在其上绘制的对象squaresize、startx和starty。squaresize表示我们将绘制的正方形的大小,而startx和starty表示正方形起点的 x 和 y 坐标。
首先,我们验证所有int参数值都大于零。
接下来,我们创建一个新skcanvas对象,用于在位图上进行绘制。之后,我们实例化一个新skpaint对象并将其设置color为skcolors.red。我们使用skpaint来定义绘制对象的样式和颜色信息:几何图形、文本和位图。
接下来,我们创建一个实例skrect,该结构体包含一个矩形的四个坐标,在我们的例子中,矩形是一个正方形。最后,我们使用方法在画布上绘制正方形drawrect(),该方法同时接受一个skrect参数 ( square) 和一个skpaint( paint) 参数。
保存图像
现在,让我们创建一个保存图像的方法:
public static void saveimage(skbitmap bitmap, string outputpath) { using var stream = new filestream(outputpath, filemode.create, fileaccess.write); using var image = skimage.frombitmap(bitmap); using var encodedimage = image.encode(); encodedimage.saveto(stream); }
这里我们定义saveimage()静态方法,它接受两个参数:bitmap和outputpath。
我们首先实例化一个filestream用于创建文件的对象,设置filemodetofilemode.create来创建文件或覆盖文件(如果文件已存在),以及fileaccessto fileaccess.write。
接下来,我们将位图转换为skimage,然后调用无参数encode()方法,该方法默认将我们的编码skimage为png格式。然后我们最终将其保存到filestream。
这些using声明确保每个可释放对象在使用后都会被调用dispose()方法,以确保正确的资源管理。
生成样本图像
现在,让我们将之前创建的方法带入我们的program类并创建一个新的图像:
string outputpath = @"outputimage.png"; int imagewidth = 400; int imageheight = 300; int squaresize = 120; int startx = (imagewidth - squaresize) / 2; int starty = (imageheight - squaresize) / 2; var bitmap = imageservice.createblankimage(imagewidth, imageheight); imageservice.drawsquareonimage(bitmap, squaresize, startx, starty); imageservice.saveimage(bitmap, outputpath); console.writeline("image generated and saved successfully.");
我们指定目录的路径,用于outputimage.png保存生成的图像。我们所需的目录是包含我们.exe文件的文件夹,即我们的“net8.0”文件夹。
我们将imagewidth、imageheight和squaresize分别设置为400px、300px和120px。
imagewidth接下来,我们通过提供和来计算正方形相对于 x 轴的起点squaresize。类似地,我们提供imageheight和squaresize来计算正方形的 y 轴起点。
之后,我们createblankimage()从imageservice类中调用方法,提供imagewidth和imageheight来创建我们的bitmap。
创建图像后,我们调用drawsquareonimage()方法,提供我们的bitmap和我们之前计算的值:squaresize,startx,starty。这样,正方形就画在我们的 上了bitmap。
最后,我们将修改后的内容保存bitmap到我们之前定义的outputpath,并在控制台上打印确认消息。
让我们测试一下:
image generated and saved successfully.
正如预期的那样,看到了一条成功消息。
看一下我们的图像:
总结
在本文中,我们通过示例操作一些图像,研究了如何使用 skiasharp 库在 c# 中生成和处理图像。
.net core 应用程序中的图像上绘制图形和文本(4 个简单步骤)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论