最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用SkiaSharp在C#中如何生成圖像

 更新時(shí)間:2025年01月07日 09:51:54   作者:坐井觀老天  
本文介紹了如何使用SkiaSharp庫在C#中生成和處理圖像,通過創(chuàng)建一個(gè)空白圖像并繪制一個(gè)正方形,我們展示了如何使用SkiaSharp的基本功能,如創(chuàng)建畫布、繪制圖形和保存圖像

使用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)文章

最新評(píng)論

共和县| 苍山县| 响水县| 凤山市| 芮城县| 沁源县| 商南县| 额敏县| 阜平县| 台中市| 英德市| 家居| 东兴市| 嘉义县| 洪湖市| 顺平县| 新余市| 鱼台县| 浪卡子县| 闽清县| 包头市| 房山区| 辽宁省| 深州市| 弋阳县| 香港 | 宣城市| 苏尼特右旗| 井研县| 黄平县| 高清| 梓潼县| 阿尔山市| 澳门| 廊坊市| 阜城县| 石屏县| 绍兴县| 雷山县| 蒙山县| 项城市|