效果展示

核心繪圖流程
1. 畫布初始化與樣式定義
Bitmap bt = new Bitmap(353, 404, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bt);
g.Clear(Color.LightBlue);
Font titleFont = new Font("Tahoma", 10, FontStyle.Bold);
Font normalFont = new Font("Tahoma", 9, FontStyle.Bold);
2. 結構化文本佈局(座標精確控制)
// 表頭
g.DrawString("中國電子學會電子設計工程師認證考試", titleFont, Brushes.Black, new PointF(46, 20));
g.DrawString("准 考 證", titleFont, Brushes.Black, new PointF(140, 50));
// 字段映射表:Label -> Value -> Position
var fields = new[] {
new { Label="准考證號", Value="EDP200903060001", Y=85 },
new { Label="考生姓名", Value="杜潤龍", Y=115 },
// ... 其餘字段
};
foreach (var f in fields) {
g.DrawString(f.Label, normalFont, Brushes.Black, new PointF(14, f.Y));
g.DrawString(f.Value, normalFont, Brushes.Black, new PointF(90, f.Y));
}
3. 長文本自動換行算法
string address = "北京市北京工業大學地址北京工業";
int y = 335;
for (int z = 0; z < address.Length; z += 8) {
int len = Math.Min(8, address.Length - z);
g.DrawString(address.Substring(z, len), normalFont, Brushes.Black, new PointF(90, y += 18));
}
4. 防偽干擾碼生成
Random rnd = new Random();
// 雜點
for (int i = 0; i < 500; i++)
bt.SetPixel(rnd.Next(bt.Width-20), rnd.Next(bt.Height-20), Color.FromArgb(rnd.Next()));
// 隨機弧線
for (int i = 0; i < 50; i++)
g.DrawArc(new Pen(Color.FromArgb(rnd.Next())),
rnd.Next(bt.Width-20), rnd.Next(bt.Height-20),
rnd.Next(1,30), rnd.Next(1,20), rnd.Next(15,45), rnd.Next(70,270));
5. 表格線條與照片嵌入
// 橫線、豎線、外框
g.DrawLine(Pens.Black, 10, 75, 341, 75); // 示例
// 照片
Image photo = Image.FromFile(Server.MapPath("~/image/308329547.gif"));
g.DrawImage(photo, 248, 80, 89, 111);
6. 輸出與持久化
Response.ContentType = "image/Jpeg";
bt.Save(Response.OutputStream, ImageFormat.Jpeg);
// 磁盤備份
string path = Server.MapPath($@"~\zkz_image\{name}_{DateTime.Now:yyyy-MM-dd}.jpg");
bt.Save(path, ImageFormat.Jpeg);
// 資源釋放
g.Dispose(); bt.Dispose();
工程化改進建議
- 封裝為
AdmitCardGenerator 類,支持模板配置化
- 座標佈局外置 JSON,非開發人員可維護版面
- 引入
QRCode 庫生成二維碼,替代干擾碼提升防偽等級
- 使用
using 確保非托管資源確定性釋放