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

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

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

使用SkiaSharp在C#中生成圖像

在本文中,我們將學(xué)習(xí)如何使用 SkiaSharp 在 C# 中生成圖像。

什么是 SkiaSharp?

SkiaSharp 庫是一個適用于 .NET 平臺的跨平臺 2D 圖形 API,它基于 Google 的 Skia Graphics 庫,后者是一個用于繪制文本、幾何圖形和圖像的綜合庫。該庫是 Google Chrome、ChromeOS、Android 和 Flutter 等各種 Google 產(chǎn)品中使用的圖形引擎。

在本文中,我們將探索使用 SkiaSharp 創(chuàng)建一個空白圖像,然后在創(chuàng)建的圖像中間繪制一個正方形。

讓我們首先在終端上導(dǎo)航到我們的項目目錄來導(dǎo)入 NuGet 包:

創(chuàng)建圖像

接下來,讓我們創(chuàng)建一個ImageService靜態(tài)類,在其中定義一些輔助方法,首先創(chuàng)建一個空白圖像

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ù)并返回一個bitmap類型SKBitmap,它代表 SkiaSharp 中的圖像。

我們首先使用SKBitmap給定的width和創(chuàng)建一個對象height。然后,我們SKCanvas使用初始化一個新對象SKBitmap。這樣,我們將畫布鏈接到位圖。該類SKCanvas表示 SkiaSharp 中的畫布或繪圖表面。它提供繪制圖形、文本和圖像的方法。

當(dāng)我們最初創(chuàng)建位圖時,其像素數(shù)據(jù)由未定義的隨機值組成。在使用構(gòu)造函數(shù)將位圖附加到畫布時SKCanvas(),我們創(chuàng)建了一種操作圖像像素數(shù)據(jù)的方法。如果沒有畫布,位圖將保持未初始化的隨機值。

請注意,SKCanvas對象是可丟棄的,因此添加了使用聲明以確保正確清理。

接下來,我們使用方法清除整個畫布SKCanvas.Clear(SKColor)。該Clear()方法將畫布內(nèi)的所有像素設(shè)置為單一顏色,在我們的例子中為SKColors.White。如果我們調(diào)用無參數(shù)重載,Clear()所有像素將設(shè)置為SKColor.Empty(#00000000)。

處理圖像

現(xiàn)在,讓我們創(chuàng)建一個方法在圖像的中心繪制一個正方形:

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()方法,它將在提供的圖像上繪制一個正方形。它有四個參數(shù),即SKBitmap我們將在其上繪制的對象squareSize、startX和startY。squareSize表示我們將繪制的正方形的大小,而startX和startY表示正方形起點的 X 和 Y 坐標(biāo)。

首先,我們驗證所有int參數(shù)值都大于零。

接下來,我們創(chuàng)建一個新SKCanvas對象,用于在位圖上進行繪制。之后,我們實例化一個新SKPaint對象并將其設(shè)置Color為SKColors.Red。我們使用SKPaint來定義繪制對象的樣式和顏色信息:幾何圖形、文本和位圖。

接下來,我們創(chuàng)建一個實例SKRect,該結(jié)構(gòu)體包含一個矩形的四個坐標(biāo),在我們的例子中,矩形是一個正方形。最后,我們使用方法在畫布上繪制正方形DrawRect(),該方法同時接受一個SKRect參數(shù) ( square) 和一個SKPaint( paint) 參數(shù)。

保存圖像

現(xiàn)在,讓我們創(chuàng)建一個保存圖像的方法:

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)方法,它接受兩個參數(shù):bitmap和outputPath。

我們首先實例化一個FileStream用于創(chuàng)建文件的對象,設(shè)置FileModetoFileMode.Create來創(chuàng)建文件或覆蓋文件(如果文件已存在),以及FileAccessto FileAccess.Write。

接下來,我們將位圖轉(zhuǎn)換為SKImage,然后調(diào)用無參數(shù)Encode()方法,該方法默認(rèn)將我們的編碼SKImage為PNG格式。然后我們最終將其保存到FileStream。

這些using聲明確保每個可釋放對象在使用后都會被調(diào)用Dispose()方法,以確保正確的資源管理。

生成樣本圖像

現(xiàn)在,讓我們將之前創(chuàng)建的方法帶入我們的Program類并創(chuàng)建一個新的圖像:

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接下來,我們通過提供和來計算正方形相對于 x 軸的起點squareSize。類似地,我們提供imageHeight和squareSize來計算正方形的 y 軸起點。

之后,我們CreateBlankImage()從ImageService類中調(diào)用方法,提供imageWidth和imageHeight來創(chuàng)建我們的bitmap。

創(chuàng)建圖像后,我們調(diào)用DrawSquareOnImage()方法,提供我們的bitmap和我們之前計算的值:squareSize,startX,startY。這樣,正方形就畫在我們的 上了bitmap。

最后,我們將修改后的內(nèi)容保存bitmap到我們之前定義的outputPath,并在控制臺上打印確認(rèn)消息。

讓我們測試一下:

Image generated and saved successfully.

正如預(yù)期的那樣,看到了一條成功消息。

看一下我們的圖像:

總結(jié)

在本文中,我們通過示例操作一些圖像,研究了如何使用 SkiaSharp 庫在 C# 中生成和處理圖像。

 .NET Core 應(yīng)用程序中的圖像上繪制圖形和文本(4 個簡單步驟)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 你是不是這樣寫異常處理代碼的呢?

    你是不是這樣寫異常處理代碼的呢?

    本篇文章是對,你是不是這樣寫異常處理代碼的進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談C#六大設(shè)計原則

    淺談C#六大設(shè)計原則

    這篇文章主要介紹了C#六大設(shè)計原則的相關(guān)內(nèi)容,文中代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C#實現(xiàn)批量重命名文件的項目實踐

    C#實現(xiàn)批量重命名文件的項目實踐

    文件重命名是一個在IT行業(yè)中常見的任務(wù),它涉及到對大量文件進行系統(tǒng)性的命名更改,以便于更有效的文件管理和數(shù)據(jù)檢索,下面就來詳細(xì)的介紹一下C#實現(xiàn)批量重命名文件,感興趣的可以了解一下
    2026-05-05
  • C#通過xpath查找xml指定元素的方法

    C#通過xpath查找xml指定元素的方法

    這篇文章主要介紹了C#通過xpath查找xml指定元素的方法,涉及C#操作XML文件的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#中OpenCVSharp實現(xiàn)輪廓檢測

    C#中OpenCVSharp實現(xiàn)輪廓檢測

    這篇文章主要介紹了C#中OpenCVSharp實現(xiàn)輪廓檢測,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 解析C#中委托的同步調(diào)用與異步調(diào)用(實例詳解)

    解析C#中委托的同步調(diào)用與異步調(diào)用(實例詳解)

    本篇文章是對C#中委托的同步調(diào)用與異步調(diào)用進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C# 實現(xiàn)截圖軟件功能實例代碼

    C# 實現(xiàn)截圖軟件功能實例代碼

    這篇文章主要介紹了C# 實現(xiàn)截圖軟件功能實例代碼,需要的朋友可以參考下
    2017-06-06
  • Unity實現(xiàn)圖片輪播組件

    Unity實現(xiàn)圖片輪播組件

    這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)圖片輪播組件的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#使用kernel32.dll讀寫INI文件的案例詳解

    C#使用kernel32.dll讀寫INI文件的案例詳解

    INI就是擴展名為"INI"的文件,其實他本身是個文本文件,可以用記事本打開,主要存放的是用戶所做的選擇或系統(tǒng)的各種參數(shù),這篇文章主要介紹了C#使用kernel32.dll讀寫INI文件的方法,需要的朋友可以參考下
    2023-05-05
  • C#版ftp方法實現(xiàn)類的代碼

    C#版ftp方法實現(xiàn)類的代碼

    C#版ftp方法實現(xiàn)類的代碼...
    2007-04-04

最新評論

双柏县| 丰都县| 石首市| 峨边| 海门市| 岳普湖县| 贵阳市| 桦川县| 新巴尔虎右旗| 舟山市| 资阳市| 平昌县| 武宣县| 泸溪县| 鹤峰县| 寿宁县| 克山县| 高尔夫| 东城区| 镇坪县| 南充市| 华安县| 龙游县| 湟中县| 杂多县| 田东县| 彭泽县| 兴化市| 崇信县| 沙湾县| 建瓯市| 合江县| 丰宁| 吴川市| 青河县| 拜泉县| 平武县| 安塞县| 洞头县| 莱芜市| 高安市|