专注于知识
经验、资源的分享

C# Asp.net根据字符串动态生成漂亮大气图片

小编最近在做一个项目,客户要求每个单据审批的状态、单据处理的状态,以图片的形式显示在单据的顶部,刚开始我还是想用图片代替,但是系统的审批流程状态、单据处理的状态都是客户自定义,不能使用图片代替,只能根据状态字符串动态生成图片。

在网上找了很多方法都没有达到我想要的效果,使用微软自带的GDI绘制的图片不美观,绘制圆角会严重的锯齿,使用用第三方绘图库又不好维护,最后让UI设置状态效果图,将图片切成左上右下四个个图片,先计算字符串的宽度,得到画布的宽度和高度,先绘制左边上边的图片,再绘制字符串,最后绘制下边右边的图片,最终的效果如下图

C# Asp.net根据字符串动态生成图片

代码如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace Common
{
    public class ImgHelper
    {

        ///根据字符串生成图片
        ///string str 字符串
        ///string type 图片类型
        public static byte[] GenerateImage(string str,string type)
        {
            //计算画布的宽度和高度
            //宽度=左边图片的宽度+字符串的宽度+右边图片的宽度
            //高度=顶部图片的高度+字符串的高度+底部图片的高度
            int initWidth = 0;
            //默认图片中高度为26
            int initHeight = 26;
            //字体大小
            float fontSize = 14.0f;
            //定义字体样式
            Font theFont = new Font("宋体", fontSize, System.Drawing.FontStyle.Regular);
            //定义临时变量,获取字符串的宽度
            Bitmap tempBitmap = new Bitmap(600, 600);
            Graphics tempGraphics = Graphics.FromImage(tempBitmap);
            SizeF size= tempGraphics.MeasureString(str, theFont);

            initWidth += Convert.ToInt32(size.Width);
            
            string serverPath = HttpContext.Current.Server.MapPath("/");
            serverPath += "/Content/image/"+ type+"_";
            //图片命名格式:图片类型_left.png 例如process_left.png
            Image imgleft = Image.FromFile(serverPath+ "left.png");
            initWidth += imgleft.Width;
            Image imgright = Image.FromFile(serverPath + "right.png");
             initWidth += imgright.Width;
            Image imgtop = Image.FromFile(serverPath + "top.png");
            initHeight += imgtop.Height;
            Image imgbottom = Image.FromFile(serverPath + "bottom.png");
            initHeight += imgbottom.Height;
           
            Bitmap theBitmap = new Bitmap(initWidth, initHeight);
            Graphics theGraphics = Graphics.FromImage(theBitmap);
            theGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
            theGraphics.Clear(Color.White);
            //绘制左边图片
            theGraphics.DrawImage(imgleft, new Point(0, 0));
            try
            {
                 
                //准备工作。定义画刷颜色红色
                Brush newBrush = new SolidBrush(Color.Red);
                //绘制顶部图片
                int margintop =imgtop.Height+3;
                theGraphics.DrawImage(imgtop, new Point(imgleft.Width, 0));
                //绘制字符串
                theGraphics.DrawString(str, theFont, newBrush, imgleft.Width, margintop);
                //绘制底部图片
                theGraphics.DrawImage(imgbottom, new Point(imgleft.Width, initHeight-imgbottom.Height));
                //绘制右边图片
                int rightwidth = initWidth-imgright.Width;
                theGraphics.DrawImage(imgright, new Point(rightwidth, 0));
                MemoryStream tempStream = new MemoryStream();
                theBitmap.Save(tempStream, ImageFormat.Png);
                return tempStream.ToArray();
            }
            finally
            {
                //释放资源
                tempBitmap.Dispose();
                tempGraphics.Dispose();
                theGraphics.Dispose();
                theBitmap.Dispose();
            }

            
        }

      
    }
}

本文为阿斌分享原创,转载请注明出处,更多优惠活动,精彩内容请百度搜索”阿斌分享”,有任何问题请在下方留言,谢谢大家对阿斌分享的支持。

赞(0) 打赏
本文原创转载请注明出处:阿斌分享 » C# Asp.net根据字符串动态生成漂亮大气图片
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏