调用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下载

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C#中的System.Timers.Timer是一个计时器类,可以用来定时执行某个操作或者触发某个事件。它可以在指定的时间间隔内重复执行,也可以只执行一次。使用该类需要创建一个Timer对象,设置Interval属性来指定时间间隔,然后注册Elapsed事件来处理定时器到期时的操作。在使用完毕后,需要调用Stop方法来停止计时器。 ### 回答2: c是一种最基础的编程语言,也是介绍计算机科学基础的一种语言。它的历史可以追溯到上世纪70年代,由Dennis Ritchie开发,是用来编写UNIX操作系统的。由于在计算机早期的时候,没有很多高级编程语言,c语言的出现填补了这个空白,成为了当时计算机程序员必须掌握的一种工具。之后,c语言成为了计算机领域的标准语言之一。 c语言有许多优点。其一,它是高效的,能够明显提升程序员工作效率。其二,因为c语言是面向过程的编程语言,因此较易理解与阅读,这个特点也使得c语言在很多应用领域得到了广泛的应用,例如操作系统、数据库和编译器等。 然而,相对于其他编程语言,c语言也有一些缺点。其一,它需要程序员处理内存分配、释放等底层细节,这需要程序员具备特定的技术能力。其二,c语言不支持高级抽象特性(例如对象和类),因此其编程范式比面向对象的编程语言更加原始。 综上所述,c语言的出现对计算机科学领域产生了巨大的影响并为很多应用领域提供了方便,然而在许多情况下,它已被其他编程语言所取代。但这并不影响c语言的重要性,毕竟对于任何一个计算机程序员来说,掌握c语言都是基础中的基础。 ### 回答3: 抱歉,您没有提供任何相关的问题或话题,因此我无法为您提供有意义的答案。如果您能提供更多的信息,我将非常乐意回答您的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值