C#快速入門教程(26)—— 繪圖
應用中,繪圖功能是很常見的,如驗證碼、特殊的卡證建立和列印等功能;.NET Framework類庫中關於繪圖的功能主要封裝在System.Drawing名稱空間,其中還包括一些下級名稱空間,具體應用時會給出說明。
此外,對於命名行專案,預設是不引用System.Drawing名稱空間的,需要我們在“解決方案資源管理器”中,使用“引用”的右鍵選單新增資源引用,選擇內容如下圖所示。
首先,我們瞭解了繪圖的基本操作資源,主要包含Graphics、Bitmap、Color、Brush、Pen、Font等型別,它們都定義在System.Drawing名稱空間。下面的程式碼會建立一個200*200畫素的填充正方形(紅色),然後畫兩條對角線(黃色)。
using System.Drawing;
using System.Drawing.Imaging;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
using (Bitmap bmp = new Bitmap(200, 200))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.Red);
g.DrawLine(Pens.Yellow, 0, 0, 199, 199);
g.DrawLine(Pens.Yellow, 0, 199, 199, 0);
//
bmp.Save(@"D:\test.png", ImageFormat.Png);
}
}
}
}
}
執行後,我們可以在D:\test.png檢視結果(你也可以修改自己的檔案存放位置),如下圖所示。
本例演示了影像繪製的基本操作過程。首先,建立了一個Bitmap物件,建構函式中定義了寬度(Width)和高度(Height),其單位是畫素(Pixer);然後,定義了Graphics物件,使用靜態方法FromImage()關聯了Bitmap物件;接下來的繪製工作,實際上就是呼叫了Graphics物件中的一系列方法(稍後討論);最後,使用Bitmap物件的Save()方法儲存圖片,並指定圖片為PNG格式。
從示例中,我們可以看到,主要的繪製工作是由Graphics類中的一系列方法完成的,常用的方法包括:
- Clear()方法,用於清理繪製物件,並可以指定顏色,如上例中就將背景色設定為紅色(Color.Red值)。
- 一系列的DrawXXX()方法,用於繪製線條圖形、文字或Image物件,如DrawLine()、DrawRectangle()、DrawEllipse()、DrawPie()、DrawArc()、DrawPolygon()、DrawString()、DrawImage()等方法。
- 一系列的FillXXX()方法,用於繪製填充圖片,如FillRectangle()、FillEllipse()、FillPie()、FillPolygon()等方法。
相關的資源主要包括:
- Color結構,描述使用紅(Red)、綠(Green)、藍(Blue)及透明度(Alpha)表示的顏色值;其中定義了一些常用的顏色,如Red、Green、Blue、White、Black等等。
- Brush類,定義填充圖形的格式刷的基類,可以使用Brushes類中定義的一些常用填充色格式刷物件,如Brushes.Red就是使用紅色格式刷。
- Pen類,定義繪製圖形的畫筆物件,可以使用Pens中定義的一些標準色畫筆,請注意,這些畫筆物件都是1畫素的寬度,如果需要,可以自定義Pen物件。
- Font類,定義繪製檔案的字型。
接下來,我們再通過一個示例進一步瞭解這些資源的應用。這裡,我們解決畫素和實際尺寸的問題。比如,一個證件需要列印一定的尺寸(假設為100mm*60mm),這種情況應該如何處理呢?
這裡需要了解DPI的概念,即每英寸的點數(dots per inch),這裡的DPI也可以理解為PPI,即每英寸的畫素數(pixers per inch)。知道了DPI和畫素值,就可以推算出實際的尺寸了,反之亦然。
下面的程式碼,我們就來繪製一個100mm*60mm的影像,並可以儲存或直接列印輸出。
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
// 計算相關資料
// 毫米尺寸
float mmWidth = 100f, mmHeight = 60f;
// DPI
float dpi = 300f;
// 每毫米多少點
float rate = dpi / 25.4f;
// Bitmap尺寸(畫素)
int width = (int)(mmWidth * rate);
int height = (int)(mmHeight * rate);
//
using (Bitmap bmp = new Bitmap(width, height))
{
// 設定Bitmap物件的DPI
bmp.SetResolution(dpi, dpi);
//
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.LightGray);
// 繪製矩形
Pen p = new Pen(Color.Black, 5f);
g.DrawRectangle(p, 5, 5, bmp.Width - 10, bmp.Height - 10);
// 繪製文字
Font f = new Font("黑體", 10f, FontStyle.Bold, GraphicsUnit.Millimeter);
g.DrawString("HELLO", f, Brushes.Black, 50, 50);
// 儲存圖片
bmp.Save(@"D:\test.png", ImageFormat.Png);
// 列印圖片
PrintDocument pdoc = new PrintDocument();
pdoc.PrintPage += (object s, PrintPageEventArgs e) =>
{
e.Graphics.DrawImage(bmp, 0, 0);
};
pdoc.Print();
}
}
}
}
}
執行程式碼,如果計算機連線有印表機,則會列印輸出,同時,在D:\test.png檔案可以看到如下圖所示影像。
實際應用中,我們可以將使用毫米單位的影像操作封裝為一個類,並根據需要擴充套件其成員,以適應實際開發工作。
CHY軟體小屋原創作品!
相關文章
- 《C#快速入門教程》目錄C#
- C#快速入門教程(16)—— 介面C#
- C#快速入門教程(6)——方法C#
- C#快速入門教程(21)—— 泛型C#泛型
- C#快速入門教程(15)—— 繼承C#繼承
- C#快速入門教程(8)——整數C#
- C#快速入門教程(28)—— ADO.NETC#
- Metal入門教程(一)圖片繪製
- C#快速入門教程(25)—— 日期與時間C#
- C#快速入門教程(22)—— 常用集合型別C#型別
- C#快速入門教程(30)—— 繼續學習C#
- C#快速入門教程(18)—— 異常處理C#
- C#快速入門教程(12)—— if語句結構C#
- C#快速入門教程(27)—— SQL Server資料庫C#SQLServer資料庫
- C#快速入門教程(19)—— 索引器與陣列C#索引陣列
- C#快速入門教程(5)——欄位與屬性C#
- C#快速入門教程(11)—— 字元和字串型別C#字元字串型別
- C#快速入門教程(13)—— switch語句結構C#
- C#快速入門教程(7)——資料型別概述C#資料型別
- C#快速入門教程(2)——程式碼與測試C#
- C#快速入門教程(20)—— 字串與正規表示式C#字串
- C#快速入門教程(23)—— using語句和IDisposable介面C#
- C#快速入門教程(14)—— 迴圈語句結構C#
- C#快速入門教程(4)——類成員的作用域C#
- C#快速入門教程(1)——物件導向程式設計C#物件程式設計
- Materialize快速入門教程
- Python 繪相簿 Matplotlib 入門教程Python
- Spring Boot -01- 快速入門篇(圖文教程)Spring Boot
- C#快速入門教程(24)—— 路徑、目錄與檔案C#
- C#快速入門教程(17)—— 委託、事件與Lambda表示式C#事件
- Python-matplotlib-入門教程(一)-基礎圖表繪製Python
- C# 12 Blazor入門教程C#Blazor
- Jupyter notebook快速入門教程
- 線上PS入門教程:如何對人像快速摳圖
- c#入門教程(菜鳥級)C#
- 快應用快速入門教程
- go語言快速入門教程Go
- 全面的Docker快速入門教程Docker