利用他可以批量生成准考证、生成完还可以加上批量发送准考证
最近在做一个考试系统,遇到一点小问题:考生填完个人信息交完考费需要拿着准考证去考试,为了让考生拿到准考证的过程更为傻瓜话,也防止考生再次修改信息,直接把所填信息生成为一张固定大小的jpg图片,再给图片加写杂点和曲线,这样安全和方便基本上就能顾到了,所以我就用c#画了这样一个准考证样板,希望大家能用的着,不足之处多多提出。
效果图
代码如下
sing System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
gethua();
}
}
protected void gethua()
{
Random random = new Random();
Bitmap bt = new Bitmap( 351 , 402 , PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bt);
Font fn1 = new Font( " Tahoma " , 10 , FontStyle.Bold);
Font fn = new Font( " Tahoma " , 9 , FontStyle.Bold);
g.Clear(Color.Honeydew);
g.DrawString( " 中国电子学会电子设计初级工程师认证考试名 " , fn1, Brushes.Black, new PointF( 20 , 20 ));
g.DrawString( " 准 考 证 " , fn1, Brushes.Black, new PointF( 140 , 50 ));
g.DrawString( " 准考证号 " , fn, Brushes.Black, new PointF( 14 , 85 ));
g.DrawString( " CIE09101080004 " , fn, Brushes.Black, new PointF( 90 , 85 ));
g.DrawString( " 考生姓名 " , fn, Brushes.Black, new PointF( 14 , 115 ));
g.DrawString( " 李晓杰 " , fn, Brushes.Black, new PointF( 90 , 115 ));
g.DrawString( " 考生性别 " , fn, Brushes.Black, new PointF( 14 , 145 ));
g.DrawString( " 男 " , fn, Brushes.Black, new PointF( 90 , 145 ));
g.DrawString( " 身份证号 " , fn, Brushes.Black, new PointF( 14 , 175 ));
g.DrawString( " 410381198408272032 " , fn, Brushes.Black, new PointF( 90 , 175 ));
g.DrawString( " 考试时间 " , fn, Brushes.Black, new PointF( 14 , 205 ));
g.DrawString( " 2007年11月30号 " , fn, Brushes.Black, new PointF( 90 , 205 ));
g.DrawString( " 考试科目 " , fn, Brushes.Black, new PointF( 14 , 235 ));
g.DrawString( " 电子设计 " , fn, Brushes.Black, new PointF( 90 , 235 ));
g.DrawString( " 考点名称 " , fn, Brushes.Black, new PointF( 14 , 265 ));
g.DrawString( " 电子设计工程师证书 " , fn, Brushes.Black, new PointF( 90 , 265 ));
g.DrawString( " 考场编号 " , fn, Brushes.Black, new PointF( 14 , 295 ));
g.DrawString( " 9101080004 " , fn, Brushes.Black, new PointF( 90 , 295 ));
g.DrawString( " 机位编号 " , fn, Brushes.Black, new PointF( 196 , 295 ));
g.DrawString( " 080004 " , fn, Brushes.Black, new PointF( 275 , 295 ));
g.DrawString( " 交通指南(由各考点提供) " , fn, Brushes.Black, new PointF( 14 , 325 ));
string dizhi = "" ;
int j = 320 ; // 初始坐标
for ( int z = 0 ; z < 61 ; z += 23 ) // 循环次数
{
int k = z + 20 ; // 第一次为0时
if (k > dizhi.Length) // k是否大于总字数
{
k = dizhi.Length - k; // 若大于比如k=45 dizhi.length=40 k=40-45 k=-5
int i = k + 20 ; // i = -5+20 这样就不至于截取超出范围
g.DrawString(dizhi.Substring(z, i), fn, Brushes.Black, new PointF( 14 , j += 18 ));
break ;
}
g.DrawString(dizhi.Substring(z, 23 ), fn, Brushes.Black, new PointF( 14 , j += 18 ));
}
// 产生杂点
for ( int i = 0 ; i < 500 ; i ++ )
{
int x1 = random.Next(bt.Width - 20 );
int y1 = random.Next(bt.Height - 20 );
bt.SetPixel(x1, y1, Color.FromArgb(random.Next()));
}
// 产生随机曲线
for ( int i = 0 ; i < 50 ; i ++ )
{
int x1 = random.Next(bt.Width - 20 );
int y1 = random.Next(bt.Height - 20 );
int x2 = random.Next( 1 , 30 );
int y2 = random.Next( 1 , 20 );
int x3 = random.Next( 15 , 45 );
int y3 = random.Next( 70 , 270 );
g.DrawArc( new Pen(Color.FromArgb(random.Next())), x1, y1, x2, y2, x3, y3);
}
// 画直线
g.DrawLine( new Pen(Color.Black), 10 , 75 , 341 , 75 );
g.DrawLine( new Pen(Color.Black), 10 , 105 , 243 , 105 );
g.DrawLine( new Pen(Color.Black), 10 , 135 , 243 , 135 );
g.DrawLine( new Pen(Color.Black), 10 , 165 , 243 , 165 );
g.DrawLine( new Pen(Color.Black), 10 , 195 , 341 , 195 );
g.DrawLine( new Pen(Color.Black), 10 , 225 , 341 , 225 );
g.DrawLine( new Pen(Color.Black), 10 , 255 , 341 , 255 );
g.DrawLine( new Pen(Color.Black), 10 , 285 , 341 , 285 );
g.DrawLine( new Pen(Color.Black), 10 , 315 , 341 , 315 );
g.DrawLine( new Pen(Color.Black), 80 , 75 , 80 , 314 );
g.DrawLine( new Pen(Color.Black), 185 , 285 , 185 , 314 );
g.DrawLine( new Pen(Color.Black), 265 , 285 , 265 , 314 );
g.DrawLine( new Pen(Color.Black), 243 , 75 , 243 , 195 );
// 画方框
g.DrawRectangle( new Pen(Color.Black), 10 , 10 , 331 , 382 );
// 填充图像
System.Drawing.Image newimage = System.Drawing.Image.FromFile(Server.MapPath(sdr[ " photo " ].ToString()));
// 图像定位
g.DrawImage(newimage, 245 , 77 , 95 , 117 );
// 释放图像缓存
g.Dispose();
// 定义产生图片格式
// Response.ContentType = "image/Jpeg";
// bt.Save(Response.OutputStream, ImageFormat.Jpeg);
// 图片自动保存路径
string dirpath = @" E:\Exam\client\Admin_exam\zkz_image\ " ;
if ( ! Directory.Exists(dirpath))
{
Directory.CreateDirectory(dirpath);
}
// bt.Save(Server.MapPath(dirpath + Session.SessionID + ".jpg"), ImageFormat.Jpeg);
string lujing = @" E:\Exam\client\Admin_exam\zkz_image\ " + Request.QueryString[ " id " ].ToString() + " - " + DateTime.Now.ToString( " yyyy-mm-dd " ) + " .jpg " ;
bt.Save(lujing, ImageFormat.Jpeg);
// 释放位图缓存
bt.Dispose();
}
}
效果图
代码如下
sing System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
gethua();
}
}
protected void gethua()
{
Random random = new Random();
Bitmap bt = new Bitmap( 351 , 402 , PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bt);
Font fn1 = new Font( " Tahoma " , 10 , FontStyle.Bold);
Font fn = new Font( " Tahoma " , 9 , FontStyle.Bold);
g.Clear(Color.Honeydew);
g.DrawString( " 中国电子学会电子设计初级工程师认证考试名 " , fn1, Brushes.Black, new PointF( 20 , 20 ));
g.DrawString( " 准 考 证 " , fn1, Brushes.Black, new PointF( 140 , 50 ));
g.DrawString( " 准考证号 " , fn, Brushes.Black, new PointF( 14 , 85 ));
g.DrawString( " CIE09101080004 " , fn, Brushes.Black, new PointF( 90 , 85 ));
g.DrawString( " 考生姓名 " , fn, Brushes.Black, new PointF( 14 , 115 ));
g.DrawString( " 李晓杰 " , fn, Brushes.Black, new PointF( 90 , 115 ));
g.DrawString( " 考生性别 " , fn, Brushes.Black, new PointF( 14 , 145 ));
g.DrawString( " 男 " , fn, Brushes.Black, new PointF( 90 , 145 ));
g.DrawString( " 身份证号 " , fn, Brushes.Black, new PointF( 14 , 175 ));
g.DrawString( " 410381198408272032 " , fn, Brushes.Black, new PointF( 90 , 175 ));
g.DrawString( " 考试时间 " , fn, Brushes.Black, new PointF( 14 , 205 ));
g.DrawString( " 2007年11月30号 " , fn, Brushes.Black, new PointF( 90 , 205 ));
g.DrawString( " 考试科目 " , fn, Brushes.Black, new PointF( 14 , 235 ));
g.DrawString( " 电子设计 " , fn, Brushes.Black, new PointF( 90 , 235 ));
g.DrawString( " 考点名称 " , fn, Brushes.Black, new PointF( 14 , 265 ));
g.DrawString( " 电子设计工程师证书 " , fn, Brushes.Black, new PointF( 90 , 265 ));
g.DrawString( " 考场编号 " , fn, Brushes.Black, new PointF( 14 , 295 ));
g.DrawString( " 9101080004 " , fn, Brushes.Black, new PointF( 90 , 295 ));
g.DrawString( " 机位编号 " , fn, Brushes.Black, new PointF( 196 , 295 ));
g.DrawString( " 080004 " , fn, Brushes.Black, new PointF( 275 , 295 ));
g.DrawString( " 交通指南(由各考点提供) " , fn, Brushes.Black, new PointF( 14 , 325 ));
string dizhi = "" ;
int j = 320 ; // 初始坐标
for ( int z = 0 ; z < 61 ; z += 23 ) // 循环次数
{
int k = z + 20 ; // 第一次为0时
if (k > dizhi.Length) // k是否大于总字数
{
k = dizhi.Length - k; // 若大于比如k=45 dizhi.length=40 k=40-45 k=-5
int i = k + 20 ; // i = -5+20 这样就不至于截取超出范围
g.DrawString(dizhi.Substring(z, i), fn, Brushes.Black, new PointF( 14 , j += 18 ));
break ;
}
g.DrawString(dizhi.Substring(z, 23 ), fn, Brushes.Black, new PointF( 14 , j += 18 ));
}
// 产生杂点
for ( int i = 0 ; i < 500 ; i ++ )
{
int x1 = random.Next(bt.Width - 20 );
int y1 = random.Next(bt.Height - 20 );
bt.SetPixel(x1, y1, Color.FromArgb(random.Next()));
}
// 产生随机曲线
for ( int i = 0 ; i < 50 ; i ++ )
{
int x1 = random.Next(bt.Width - 20 );
int y1 = random.Next(bt.Height - 20 );
int x2 = random.Next( 1 , 30 );
int y2 = random.Next( 1 , 20 );
int x3 = random.Next( 15 , 45 );
int y3 = random.Next( 70 , 270 );
g.DrawArc( new Pen(Color.FromArgb(random.Next())), x1, y1, x2, y2, x3, y3);
}
// 画直线
g.DrawLine( new Pen(Color.Black), 10 , 75 , 341 , 75 );
g.DrawLine( new Pen(Color.Black), 10 , 105 , 243 , 105 );
g.DrawLine( new Pen(Color.Black), 10 , 135 , 243 , 135 );
g.DrawLine( new Pen(Color.Black), 10 , 165 , 243 , 165 );
g.DrawLine( new Pen(Color.Black), 10 , 195 , 341 , 195 );
g.DrawLine( new Pen(Color.Black), 10 , 225 , 341 , 225 );
g.DrawLine( new Pen(Color.Black), 10 , 255 , 341 , 255 );
g.DrawLine( new Pen(Color.Black), 10 , 285 , 341 , 285 );
g.DrawLine( new Pen(Color.Black), 10 , 315 , 341 , 315 );
g.DrawLine( new Pen(Color.Black), 80 , 75 , 80 , 314 );
g.DrawLine( new Pen(Color.Black), 185 , 285 , 185 , 314 );
g.DrawLine( new Pen(Color.Black), 265 , 285 , 265 , 314 );
g.DrawLine( new Pen(Color.Black), 243 , 75 , 243 , 195 );
// 画方框
g.DrawRectangle( new Pen(Color.Black), 10 , 10 , 331 , 382 );
// 填充图像
System.Drawing.Image newimage = System.Drawing.Image.FromFile(Server.MapPath(sdr[ " photo " ].ToString()));
// 图像定位
g.DrawImage(newimage, 245 , 77 , 95 , 117 );
// 释放图像缓存
g.Dispose();
// 定义产生图片格式
// Response.ContentType = "image/Jpeg";
// bt.Save(Response.OutputStream, ImageFormat.Jpeg);
// 图片自动保存路径
string dirpath = @" E:\Exam\client\Admin_exam\zkz_image\ " ;
if ( ! Directory.Exists(dirpath))
{
Directory.CreateDirectory(dirpath);
}
// bt.Save(Server.MapPath(dirpath + Session.SessionID + ".jpg"), ImageFormat.Jpeg);
string lujing = @" E:\Exam\client\Admin_exam\zkz_image\ " + Request.QueryString[ " id " ].ToString() + " - " + DateTime.Now.ToString( " yyyy-mm-dd " ) + " .jpg " ;
bt.Save(lujing, ImageFormat.Jpeg);
// 释放位图缓存
bt.Dispose();
}
}