如何在控制器里生成图片
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:Visual Studio
作者:黄海浪
撰写时间:2019年5月27日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
当我们需要在特定的图片上写上特定的内容的时候就需要在控制器里生成图片,比如生成证书图片或者是奖状图片的时候,就需要在特定图片相应的位置上写入相对应的信息
控制器代码:
public ActionResult DownloadCert(int certificateId) {
try{
//查询证书信息
var dbCertificate = (from tbCertificate in myModels.CertificateITable
join tbAchievement in myModels.PW_Achievement on tbCertificate.AchievementID equals tbAchievement.AchievementID
join tbUser in myModels.PW_User on tbAchievement.UserID equals tbUser.UserID
join tbStudent in myModels.PW_Student on tbUser.UserID equals tbStudent.UserID
where tbCertificate.CertificateID == certificateId
select new{
tbStudent.StudentName,//考生姓名
tbAchievement.StTime,//考试时间
tbAchievement.Achievement,//成绩
tbCertificate.CertificateNumber,//证书编号
tbCertificate.IssuanceTime//证书颁发时间
}).Single();
//获取空白证书的物理地址
string filePath = Server.MapPath("~/Content/images/Credential2.png");
//将图片转化为位图(栅格图)
Bitmap bitmap = new Bitmap(filePath);
//封装一个绘画图面
Graphics g = Graphics.FromImage(bitmap);
//定义单色的画笔
SolidBrush solidBrush = new SolidBrush(Color.Black);
//DrawString:在指定的位置用指定的画笔(Brush)和字体(Font)对象绘制指定的文本字符串
//DrawString(要绘制的文本内容,所使用的字体,绘制文本的画刷,开始绘制的坐标点)
//考生姓名
g.DrawString(dbCertificate.StudentName, new Font("宋体", 14), solidBrush, 110, 146);
//考试时间
g.DrawString(dbCertificate.StTime.Value.Year.ToString(), new Font("宋体", 14), solidBrush, 105, 175);
g.DrawString(dbCertificate.StTime.Value.Month.ToString(), new Font("宋体", 14), solidBrush, 173, 175);
g.DrawString(dbCertificate.StTime.Value.Day.ToString(), new Font("宋体", 14), solidBrush, 220, 175);
//绘制成绩
g.DrawString(dbCertificate.Achievement.ToString(), new Font("宋体", 14), solidBrush, 184, 200);
//绘制证书编号
g.DrawString(dbCertificate.CertificateNumber.Trim(), new Font("宋体", 14), solidBrush, 150, 268);
//绘制证书时间
string strDate = dbCertificate.IssuanceTime.Value.ToString("yyyy年MM月dd日");
g.DrawString(strDate, new Font("宋体", 14), solidBrush, 340, 332);
MemoryStream ms = new MemoryStream();
//将图像以jpeg的格式保存到流中
bitmap.Save(ms, ImageFormat.Jpeg);
//以byte类型输出
byte[] newByte = ms.ToArray();
return File(newByte, @"image/jpeg");
}
catch (Exception e) {
Console.WriteLine(e);
return Json("数据异常", JsonRequestBehavior.AllowGet);
}
}
一开始是把需要写入图片里的信息给查出来,查出来之后就要获取到证书图片的物理路径,然后将图片转化为位图(栅格图)再封装一个绘画图面定义单色画笔,做完这些准备之后就开始绘画了,通过DrawString来在指定的位置用指定的画笔和字体对象绘制指定的文本字符串,最后设置图片的格式保存到内存流中