调用C# System.Drawing 画图
Posted James-李
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用C# System.Drawing 画图相关的知识,希望对你有一定的参考价值。
最近公司有个需求,根据处方数据画一张处方图片,方便给用户展示及下载打印。
废话不多说,直接上代码。
第一步:模拟一个get请求:
public string Get(int id)
var hostUrl = HostingEnvironment.MapPath("~/") + "Images/";
var imgBack = GetImage(hostUrl+"background.png");//背景图
var imgAduitPass = GetImage(hostUrl + "pass.png");//审核通过
var imgline = GetImage(hostUrl + "line.png");//线
#region 处方上信息
imgBack = CreateTextImage(imgBack, "张三", 98, 115, false, 8);//绘制姓名
imgBack = CreateTextImage(imgBack, "男", 268, 115, false, 8);
imgBack = CreateTextImage(imgBack, "35", 385, 115, false, 8);
imgBack = CreateTextImage(imgBack, DateTime.Now.ToString("yyyy-MM-dd"), 535, 115, false, 8);
imgBack = CreateTextImage(imgBack, "R2204251342562156", 98, 153, false, 8);
imgBack = CreateTextImage(imgBack, "急性胆管炎", 385, 153, false, 8);
imgBack = CreateTextImage(imgBack, "无", 98, 186, false, 8);
imgBack = CreateTextImage(imgBack, "阿莫西林胶囊05g*36粒X1盒", 98, 252, false, 8);
imgBack = CreateTextImage(imgBack, "用法:每天1粒每日3次口服", 98, 277, false, 8);
imgBack = CreateTextImage(imgBack, "28.56", 600, 605, false, 8);
#endregion
#region 生成电子印章
var doctorMark = CreateElectronicMark("吴明辉");
imgBack = CombinImage(imgBack, doctorMark,98,505);
var pharmacistMark = CreateElectronicMark("张思思");
imgBack = CombinImage(imgBack, pharmacistMark, 535, 505);
var pharmaceutistMark = CreateElectronicMark("李媛媛");//调配师
imgBack = CombinImage(imgBack, pharmaceutistMark, 98, 565);
var checkerMark = CreateElectronicMark("王雯雯");
imgBack = CombinImage(imgBack, checkerMark, 360, 565);
#endregion
imgBack = CombinImage(imgBack, imgline, (imgBack.Width-imgline.Width)/2, (imgBack.Height-imgline.Height)/2);
imgBack = CombinImage(imgBack, imgAduitPass, (imgBack.Width-imgAduitPass.Width)/2, (imgBack.Height-imgAduitPass.Height)/2);
imgBack.Save(hostUrl+"prescription.png", ImageFormat.Png);
GC.Collect();
return DateTime.Now.ToString() + ":图片已生成";
/// <summary>
/// 图片上生成文本
/// </summary>
/// <param name="backImage">背景图片</param>
/// <param name="text">文本</param>
/// <param name="x">距左x</param>
/// <param name="y">距上y</param>
/// <param name="isBold">是否加粗</param>
/// <param name="fontSize">字体大小</param>
/// <returns></returns>
public static Image CreateTextImage(Image backImage, string text, float x, float y, bool isBold, int fontSize)
Font font;
if (isBold)
font = new Font("Arial", fontSize, FontStyle.Bold);
else
font = new Font("Arial", fontSize, FontStyle.Regular);
//绘笔颜色
SolidBrush brush = new SolidBrush(Color.Black);
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
Image image = backImage;
Graphics g = Graphics.FromImage(image);
RectangleF rect = new RectangleF(x, y, backImage.Width, backImage.Height);
//绘制图片
g.DrawString(text, font, brush, rect);
//释放对象
g.Dispose();
image.Save("C:/Users/Administrator/Desktop/pic/name.png", ImageFormat.Png);
return image;
/// <summary>
/// 印章人名
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static Image CreateElectronicMark(string name)
Bitmap image = new Bitmap(110, 50);//定义电子章大小
Font font = new Font("Arial", 8, FontStyle.Regular); ;
//绘笔颜色
SolidBrush brush = new SolidBrush(Color.Red);
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
Graphics g = Graphics.FromImage(image);
SizeF sizef = g.MeasureString(name, font, PointF.Empty, format);//得到文本的宽高
int width = (int)(sizef.Width);
//int height = (int)(sizef.Height + 1);
RectangleF rect = new RectangleF((image.Width - width) / 2, 5, image.Width, image.Height);
//绘制图片
g.DrawString(name, font, brush, rect);
g.DrawString("互联网电子专用章", font, brush, new RectangleF(5, 25, image.Width, image.Height));
Pen redPen = new Pen(Color.Red, 3);
//Draw rectangle to screen.
g.DrawRectangle(redPen, 0, 0, image.Width, image.Height);
//释放对象
g.Dispose();
//image.Save("C:/Users/Administrator/Desktop/pic/ElectronicMark.png", ImageFormat.Png);
return image;
/// <summary>
/// 合并图片
/// </summary>
/// <param name="imgBack">背景图</param>
/// <param name="img">贴图</param>
/// <param name="x">距左x</param>
/// <param name="y">距上y</param>
/// <returns></returns>
public static Bitmap CombinImage(Image imgBack, Image img,int x,int y)
Bitmap bmp = new Bitmap(imgBack.Width, imgBack.Height);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
g.DrawImage(img, x, y, img.Width, img.Height); //g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
return bmp;
/// <summary>
/// Resize图片
/// </summary>
/// <param name="bmp">原始Bitmap</param>
/// <param name="newW">新的宽度</param>
/// <param name="newH">新的高度</param>
/// <param name="mode">保留着,暂时未用</param>
/// <returns>处理以后的图片</returns>
public static Image ResizeImage(Image bmp, int newW, int newH, int mode)
try
Image b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height),
GraphicsUnit.Pixel);
g.Dispose();
return b;
catch
return null;
/// <summary>
/// 根据图片的相对路径 获取Image对象
/// </summary>
/// <param name="imgPath">图片的相对路径(如:@"/images/star.png")</param>
/// <returns></returns>
public static Image GetImage(string imgPath)
if (File.Exists(imgPath))
Image im = Image.FromFile(imgPath);
return im;
else
return null;
处方效果图:
本文只做画图技术分享,电子签章可根据不同情况进行修改。
Demo下载路径:使用C#System.Drawing绘制一张处方图片-C#文档类资源-CSDN下载
以上是关于调用C# System.Drawing 画图的主要内容,如果未能解决你的问题,请参考以下文章
C# System.Drawing.Graphics 画图后,如何保存一个低质量的图片,一个占用空间较小的图片