调用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 画图后,如何保存一个低质量的图片,一个占用空间较小的图片

C#画图——Graphics

C# picturebox画直线 想把画出来的东西保存成图片

写给笨蛋徒弟的学习手册——简单的画图程序

C# 生成chart图表的三种方式

C# FrameWorkAPI 之 System.Drawing