C#快速入門教程(26)—— 繪圖

曹化宇發表於2018-11-07

應用中,繪圖功能是很常見的,如驗證碼、特殊的卡證建立和列印等功能;.NET Framework類庫中關於繪圖的功能主要封裝在System.Drawing名稱空間,其中還包括一些下級名稱空間,具體應用時會給出說明。

此外,對於命名行專案,預設是不引用System.Drawing名稱空間的,需要我們在“解決方案資源管理器”中,使用“引用”的右鍵選單新增資源引用,選擇內容如下圖所示。

enter image description here

首先,我們瞭解了繪圖的基本操作資源,主要包含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檢視結果(你也可以修改自己的檔案存放位置),如下圖所示。

enter image description here

本例演示了影像繪製的基本操作過程。首先,建立了一個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檔案可以看到如下圖所示影像。

enter image description here

實際應用中,我們可以將使用毫米單位的影像操作封裝為一個類,並根據需要擴充套件其成員,以適應實際開發工作。

CHY軟體小屋原創作品!

相關文章