使用SkiaSharp在C#中如何生成圖像
使用SkiaSharp在C#中生成圖像
在本文中,我們將學(xué)習(xí)如何使用 SkiaSharp 在 C# 中生成圖像。
什么是 SkiaSharp?
SkiaSharp 庫是一個(gè)適用于 .NET 平臺(tái)的跨平臺(tái) 2D 圖形 API,它基于 Google 的 Skia Graphics 庫,后者是一個(gè)用于繪制文本、幾何圖形和圖像的綜合庫。該庫是 Google Chrome、ChromeOS、Android 和 Flutter 等各種 Google 產(chǎn)品中使用的圖形引擎。
在本文中,我們將探索使用 SkiaSharp 創(chuàng)建一個(gè)空白圖像,然后在創(chuàng)建的圖像中間繪制一個(gè)正方形。
讓我們首先在終端上導(dǎo)航到我們的項(xiàng)目目錄來導(dǎo)入 NuGet 包:
創(chuàng)建圖像
接下來,讓我們創(chuàng)建一個(gè)ImageService靜態(tài)類,在其中定義一些輔助方法,首先創(chuàng)建一個(gè)空白圖像
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;
}這里我們看到了靜態(tài)方法的定義CreateBlankImage(),它接受width和height作為參數(shù)并返回一個(gè)bitmap類型SKBitmap,它代表 SkiaSharp 中的圖像。
我們首先使用SKBitmap給定的width和創(chuàng)建一個(gè)對(duì)象height。然后,我們SKCanvas使用初始化一個(gè)新對(duì)象SKBitmap。這樣,我們將畫布鏈接到位圖。該類SKCanvas表示 SkiaSharp 中的畫布或繪圖表面。它提供繪制圖形、文本和圖像的方法。
當(dāng)我們最初創(chuàng)建位圖時(shí),其像素?cái)?shù)據(jù)由未定義的隨機(jī)值組成。在使用構(gòu)造函數(shù)將位圖附加到畫布時(shí)SKCanvas(),我們創(chuàng)建了一種操作圖像像素?cái)?shù)據(jù)的方法。如果沒有畫布,位圖將保持未初始化的隨機(jī)值。
請(qǐng)注意,SKCanvas對(duì)象是可丟棄的,因此添加了使用聲明以確保正確清理。
接下來,我們使用方法清除整個(gè)畫布SKCanvas.Clear(SKColor)。該Clear()方法將畫布內(nèi)的所有像素設(shè)置為單一顏色,在我們的例子中為SKColors.White。如果我們調(diào)用無參數(shù)重載,Clear()所有像素將設(shè)置為SKColor.Empty(#00000000)。
處理圖像
現(xiàn)在,讓我們創(chuàng)建一個(gè)方法在圖像的中心繪制一個(gè)正方形:
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);
}這里我們定義了一個(gè)DrawSquareOnImage()方法,它將在提供的圖像上繪制一個(gè)正方形。它有四個(gè)參數(shù),即SKBitmap我們將在其上繪制的對(duì)象squareSize、startX和startY。squareSize表示我們將繪制的正方形的大小,而startX和startY表示正方形起點(diǎn)的 X 和 Y 坐標(biāo)。
首先,我們驗(yàn)證所有int參數(shù)值都大于零。
接下來,我們創(chuàng)建一個(gè)新SKCanvas對(duì)象,用于在位圖上進(jìn)行繪制。之后,我們實(shí)例化一個(gè)新SKPaint對(duì)象并將其設(shè)置Color為SKColors.Red。我們使用SKPaint來定義繪制對(duì)象的樣式和顏色信息:幾何圖形、文本和位圖。
接下來,我們創(chuàng)建一個(gè)實(shí)例SKRect,該結(jié)構(gòu)體包含一個(gè)矩形的四個(gè)坐標(biāo),在我們的例子中,矩形是一個(gè)正方形。最后,我們使用方法在畫布上繪制正方形DrawRect(),該方法同時(shí)接受一個(gè)SKRect參數(shù) ( square) 和一個(gè)SKPaint( paint) 參數(shù)。
保存圖像
現(xiàn)在,讓我們創(chuàng)建一個(gè)保存圖像的方法:
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()靜態(tài)方法,它接受兩個(gè)參數(shù):bitmap和outputPath。
我們首先實(shí)例化一個(gè)FileStream用于創(chuàng)建文件的對(duì)象,設(shè)置FileModetoFileMode.Create來創(chuàng)建文件或覆蓋文件(如果文件已存在),以及FileAccessto FileAccess.Write。
接下來,我們將位圖轉(zhuǎn)換為SKImage,然后調(diào)用無參數(shù)Encode()方法,該方法默認(rèn)將我們的編碼SKImage為PNG格式。然后我們最終將其保存到FileStream。
這些using聲明確保每個(gè)可釋放對(duì)象在使用后都會(huì)被調(diào)用Dispose()方法,以確保正確的資源管理。
生成樣本圖像
現(xiàn)在,讓我們將之前創(chuàng)建的方法帶入我們的Program類并創(chuàng)建一個(gè)新的圖像:
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分別設(shè)置為400px、300px和120px。
imageWidth接下來,我們通過提供和來計(jì)算正方形相對(duì)于 x 軸的起點(diǎn)squareSize。類似地,我們提供imageHeight和squareSize來計(jì)算正方形的 y 軸起點(diǎn)。
之后,我們CreateBlankImage()從ImageService類中調(diào)用方法,提供imageWidth和imageHeight來創(chuàng)建我們的bitmap。
創(chuàng)建圖像后,我們調(diào)用DrawSquareOnImage()方法,提供我們的bitmap和我們之前計(jì)算的值:squareSize,startX,startY。這樣,正方形就畫在我們的 上了bitmap。
最后,我們將修改后的內(nèi)容保存bitmap到我們之前定義的outputPath,并在控制臺(tái)上打印確認(rèn)消息。
讓我們測試一下:
Image generated and saved successfully.
正如預(yù)期的那樣,看到了一條成功消息。
看一下我們的圖像:

總結(jié)
在本文中,我們通過示例操作一些圖像,研究了如何使用 SkiaSharp 庫在 C# 中生成和處理圖像。
.NET Core 應(yīng)用程序中的圖像上繪制圖形和文本(4 個(gè)簡單步驟)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)批量重命名文件的項(xiàng)目實(shí)踐
文件重命名是一個(gè)在IT行業(yè)中常見的任務(wù),它涉及到對(duì)大量文件進(jìn)行系統(tǒng)性的命名更改,以便于更有效的文件管理和數(shù)據(jù)檢索,下面就來詳細(xì)的介紹一下C#實(shí)現(xiàn)批量重命名文件,感興趣的可以了解一下2026-05-05
C#中OpenCVSharp實(shí)現(xiàn)輪廓檢測
這篇文章主要介紹了C#中OpenCVSharp實(shí)現(xiàn)輪廓檢測,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
解析C#中委托的同步調(diào)用與異步調(diào)用(實(shí)例詳解)
本篇文章是對(duì)C#中委托的同步調(diào)用與異步調(diào)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C# 實(shí)現(xiàn)截圖軟件功能實(shí)例代碼
這篇文章主要介紹了C# 實(shí)現(xiàn)截圖軟件功能實(shí)例代碼,需要的朋友可以參考下2017-06-06

