將純文字或 Log 檔案轉換為圖片,適用於防止內容被複製、產生驗證碼圖片、生成報表快照等場景。.NET System.Drawing 命名空間提供 GDI+ 繪圖功能,可輕鬆實現「量測文字尺寸 → 建立對應大小位圖 → 繪製文字 → 儲存」的完整流程。
using System.Drawing;
using System.Drawing.Text;
using System.IO;
///
/// 將指定文字檔內容繪製為 PNG 圖片
///
/// 來源文字檔完整路徑
/// 輸出圖片完整路徑
public void ConvertTextFileToImage(string textFile, string imageFile)
{
// 1. 設定字型與預測尺寸
Font drawFont = new Font("標楷體", 12); // 中文建議使用標楷體或微軟正黑體
Bitmap img = new Bitmap(1, 1); // 1x1 像素暫時畫布
Graphics g = Graphics.FromImage(img);
// 讀取檔案內容(指定編碼避免亂碼)
string text = File.ReadAllText(textFile, Encoding.GetEncoding("GB2312")); // 或 UTF-8
// 量測文字在指定寬度下的實際高度
SizeF sf = g.MeasureString(text, drawFont, 1024); // 限制最大寬度 1024px
// 2. 建立實際尺寸的位圖並重新取得 Graphics
img.Dispose(); // 釋放 1x1 畫布
img = new Bitmap(img, new Size((int)Math.Ceiling(sf.Width), (int)Math.Ceiling(sf.Height)));
g = Graphics.FromImage(img);
// 3. 繪圖設定
g.Clear(Color.White); // 白底
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; // 反鋸齒
g.DrawString(text, drawFont, Brushes.Black, new RectangleF(PointF.Empty, sf));
// 4. 儲存與資源釋放
img.Save(imageFile, System.Drawing.Imaging.ImageFormat.Png);
g.Dispose();
img.Dispose();
}
// 在 ASP.NET 頁面中呼叫
ConvertTextFileToImage(Server.MapPath("~/Log.txt"), Server.MapPath("~/Log.png"));
| 步驟 | 關鍵 API | 說明 |
|---|---|---|
| 量測文字 | Graphics.MeasureString | 傳入最大寬度可獲得自動換行後的實際高度,避免文字被截斷。 |
| 建立位圖 | new Bitmap(width, height) | 依量測結果動態決定圖片大小,不浪費空間。 |
| 繪製品質 | TextRenderingHint.AntiAliasGridFit | 開啟次像素反鋸齒,中文顯示更銳利。 |
| 編碼處理 | Encoding.GetEncoding("GB2312") | 依實際檔案編碼調整,現代專案建議統一 UTF-8。 |
| 資源釋放 | Dispose() | GDI+ 物件屬非託管資源,必須明確釋放,避免記憶體洩漏。 |
MeasureString 的寬度參數需足夠大,或改用 StringFormat 設定換行規則。PrivateFontCollection 載入。System.Drawing.Common 僅支援 Windows;Linux/Docker 需安裝 libgdiplus 或改用 SkiaSharp/ImageSharp 等跨平台庫。PdfSharp 或 iTextSharp 將同樣 Graphics 邏輯導向 PDF 頁面。利用 System.Drawing 將文字檔轉圖片只需 20 行核心程式碼,關鍵在於「先量測後建立位圖」與「正確釋放資源」。根據部署環境選擇相容的繪圖庫,即可穩定應用於生產系統。