欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

  • Unity之跑馬燈抽獎效果單抽與連抽(附demo)

    Unity之跑馬燈抽獎效果單抽與連抽(附demo)

    這篇文章主要介紹了Unity之跑馬燈抽獎效果單抽與連抽,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C# DatagridView常用操作匯總

    C# DatagridView常用操作匯總

    這篇文章主要介紹了C# DatagridView常用操作匯總,羅列了一些常用的用法與技巧,需要的朋友可以參考下
    2014-07-07
  • c#不使用系統(tǒng)api實現(xiàn)可以指定區(qū)域屏幕截屏功能

    c#不使用系統(tǒng)api實現(xiàn)可以指定區(qū)域屏幕截屏功能

    這篇文章主要介紹了不使用系統(tǒng)API通過純c#實現(xiàn)屏幕指定區(qū)域截屏功能,截屏后還可以保存圖象文件,大家參考使用吧
    2014-01-01
  • C#線程開發(fā)之System.Thread類詳解

    C#線程開發(fā)之System.Thread類詳解

    本文詳細(xì)講解了C#線程開發(fā)之System.Thread類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#中this的使用實例分析

    C#中this的使用實例分析

    這篇文章主要介紹了C#中this的使用方法,this是C#程序設(shè)計中非常重要的一個關(guān)鍵字,本文以實例形式對此作出簡單的用法分析,需要的朋友可以參考下
    2014-08-08
  • C#操作JSON(序列化與反序列化)的方法詳解

    C#操作JSON(序列化與反序列化)的方法詳解

    .net?core提供了Json處理模塊,在命名空間System.Text.Json中,本文將通過頂級語句,對C#的Json功能進行講解,感興趣的小伙伴可以了解一下
    2023-05-05
  • Unity平臺模擬自動擋駕駛汽車

    Unity平臺模擬自動擋駕駛汽車

    這篇文章主要為大家詳細(xì)介紹了Unity平臺模擬自動擋駕駛汽車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 基于C#開發(fā)中的那些編碼問題(詳談)

    基于C#開發(fā)中的那些編碼問題(詳談)

    下面小編就為大家分享一篇基于C#開發(fā)中的那些編碼問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • ItemsControl 數(shù)據(jù)綁定的兩種方式

    ItemsControl 數(shù)據(jù)綁定的兩種方式

    這篇文章主要介紹了ItemsControl 數(shù)據(jù)綁定的兩種方式,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#流類FileStream學(xué)習(xí)使用筆記

    C#流類FileStream學(xué)習(xí)使用筆記

    這篇文章主要介紹了C#流類FileStream學(xué)習(xí)使用筆記,本文直接給出示例代碼,代碼中每一步都有詳細(xì)注釋,需要的朋友可以參考下
    2015-06-06

最新評論