参考Knight 的代码如下:

生成印章准备的类文件:

namespace  Seal
... {
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Diagnostics;
    /**//// <summary>
    /// Summary description for TextOnSeal.
    /// </summary>
    public class TextOnSeal
    ...{
        private string _text;
        private Font _font;
        private Color _pathcolor = Color.Red;
        private Color _color = Color.Black;
        private Color _fillcolor = Color.Black;
        private int _letterspace = 10;
        private bool _showpath = true;
        private Rectangle _rectcircle;
        private Rectangle _rect;
        private int _intentlength = 10;
        private Char_Direction _chardirect = Char_Direction.Center;
        private int _degree = 90;
        private string _basestring;
        Class_Properties#region Class_Properties
        public Char_Direction CharDirection
        ...{
            get ...{ return _chardirect; }
            set
            ...{
                if (_chardirect != value)
                ...{
                    _chardirect = value;
                    switch (_chardirect)
                    ...{
                        case Char_Direction.Center:
                            _degree = 90;
                            break;
                        case Char_Direction.ClockWise:
                            _degree = 0;
                            break;
                        case Char_Direction.OutSide:
                            _degree = -90;
                            break;
                        case Char_Direction.AntiClockWise:
                            _degree = 180;
                            break;
                    }
                }
            }
        }

        public string BaseString
        ...{
            get ...{ return _basestring; }
            set ...{ _basestring = value; }
        }



        public string Text
        ...{
            get ...{ return _text; }
            set ...{ _text = value; }
        }

        public Font TextFont
        ...{
            get ...{ return _font; }
            set ...{ _font = value; }
        }

        public Color PathColor
        ...{
            get ...{ return _pathcolor; }
            set ...{ _pathcolor = value; }
        }

        public Color ColorTOP
        ...{
            get ...{ return _color; }
            set ...{ _color = value; }
        }


        public Color FillColor
        ...{
            get ...{ return _fillcolor; }
            set ...{ _fillcolor = value; }
        }



        public int LetterSpace
        ...{
            get ...{ return _letterspace; }
            set ...{ _letterspace = value; }
        }



        public bool ShowPath
        ...{
            get ...{ return _showpath; }
            set ...{ _showpath = value; }
        }


        public int SealSize
        ...{
            set
            ...{
                _rect = new Rectangle(0, 0, value, value);
                _rectcircle = new Rectangle(
                    new Point(_rect.X + _intentlength, _rect.Y + _intentlength),
                    new Size(_rect.Width - 2 * _intentlength, _rect.Height - 2 * _intentlength));
            }
        }

        #endregion {Class_Properties}
        public void SetIndent(int IntentLength)
        ...{
            _intentlength = IntentLength;
            _rectcircle = new Rectangle(_intentlength, _intentlength,
                _rect.Width - _intentlength * 2, _rect.Height - _intentlength * 2);
        }

        public TextOnSeal()
        ...{

        }


        public Bitmap TextOnPathBitmap(
            Rectangle rectCircle,
            string strText,
            Font fntText,
            Color clrColor,
            Color clrFill,
            int nPercentage)
        ...{
            _rect = rectCircle;
            _rectcircle = new Rectangle(
                new Point(_rect.X + _intentlength, _rect.Y + _intentlength),
                new Size(_rect.Width - 2 * _intentlength, _rect.Height - 2 * _intentlength));
            _text = strText;
            _font = fntText;
            _color = clrColor;
            _fillcolor = clrFill;
            _letterspace = nPercentage;
            return TextOnPathBitmap();
        }



        /**//// <summary>
        /// Compute string total length and every char length
        /// </summary>
        /// <param name="sText"></param>
        /// <param name="g"></param>
        /// <param name="fCharWidth"></param>
        /// <param name="fIntervalWidth"></param>
        /// <returns></returns>
        private float ComputeStringLength(string sText, Graphics g, float[] fCharWidth,
            float fIntervalWidth,
            Char_Direction Direction)
        ...{
            // Init string format
            StringFormat sf = new StringFormat();
            sf.Trimming = StringTrimming.None;
            sf.FormatFlags = StringFormatFlags.NoClip | StringFormatFlags.NoWrap
                | StringFormatFlags.LineLimit;
            // Measure whole string length
            SizeF size = g.MeasureString(sText, _font, (int)_font.Style);
            RectangleF rect = new RectangleF(0f, 0f, size.Width, size.Height);
            // Measure every character size
            CharacterRange[] crs = new CharacterRange[sText.Length];
            for (int i = 0; i < sText.Length; i++)
                crs[i] = new CharacterRange(i, 1);
            // Reset string format
            sf.FormatFlags = StringFormatFlags.NoClip;
            sf.SetMeasurableCharacterRanges(crs);
            sf.Alignment = StringAlignment.Near;
            // Get every character size
            Region[] regs = g.MeasureCharacterRanges(sText,
                _font, rect, sf);
            // Re-compute whole string length with space interval width
            float fTotalWidth = 0f;
            for (int i = 0; i < regs.Length; i++)
            ...{
                if (Direction == Char_Direction.Center || Direction == Char_Direction.OutSide)
                    fCharWidth[i] = regs[i].GetBounds(g).Width;
                else
                    fCharWidth[i] = regs[i].GetBounds(g).Height;
                fTotalWidth += fCharWidth[i] + fIntervalWidth;
            }
            fTotalWidth -= fIntervalWidth;//Remove the last interval width
            return fTotalWidth;
        }



        /**//// <summary>
        /// Compute every char position
        /// </summary>
        /// <param name="CharWidth"></param>
        /// <param name="recChars"></param>
        /// <param name="CharAngle"></param>
        /// <param name="StartAngle"></param>
        private void ComputeCharPos(
            float[] CharWidth,
            PointF[] recChars,
            double[] CharAngle,
            double StartAngle)
        ...{
            double fSweepAngle, fCircleLength;
            //Compute the circumference
            fCircleLength = _rectcircle.Width * Math.PI;
            for (int i = 0; i < CharWidth.Length; i++)
            ...{
                //Get char sweep angle
                fSweepAngle = CharWidth[i] * 360 / fCircleLength;
                //Set point angle
                CharAngle[i] = StartAngle + fSweepAngle / 2;
                //Get char position
                if (CharAngle[i] < 270f)
                    recChars[i] = new PointF(
                        _rectcircle.X + _rectcircle.Width / 2
                        - (float)(_rectcircle.Width / 2 *
                        Math.Sin(Math.Abs(CharAngle[i] - 270) * Math.PI / 180)),
                        _rectcircle.Y + _rectcircle.Width / 2
                        - (float)(_rectcircle.Width / 2 * Math.Cos(
                        Math.Abs(CharAngle[i] - 270) * Math.PI / 180)));
                else
                    recChars[i] = new PointF(
                        _rectcircle.X + _rectcircle.Width / 2
                        + (float)(_rectcircle.Width / 2 *
                        Math.Sin(Math.Abs(CharAngle[i] - 270) * Math.PI / 180)),
                        _rectcircle.Y + _rectcircle.Width / 2
                        - (float)(_rectcircle.Width / 2 * Math.Cos(
                        Math.Abs(CharAngle[i] - 270) * Math.PI / 180)));
                //Get total sweep angle with interval space
                fSweepAngle = (CharWidth[i] + _letterspace) * 360 / fCircleLength;
                StartAngle += fSweepAngle;
            }
        }



        /**//// <summary>
        /// Generate seal bitmap
        /// </summary>
        /// <returns></returns>
        public Bitmap TextOnPathBitmap()
        ...{
            // Create bitmap and graphics
            Bitmap bit = new Bitmap(_rect.Width, _rect.Height);
            Graphics g = Graphics.FromImage(bit);
            // Compute string length in graphics
            float[] fCharWidth = new float[_text.Length];
            float fTotalWidth = ComputeStringLength(_text, g, fCharWidth,
                _letterspace, _chardirect);
            // Compute arc's start-angle and end-angle
            double fStartAngle, fSweepAngle;
            fSweepAngle = fTotalWidth * 360 / (_rectcircle.Width * Math.PI);
            fStartAngle = 270 - fSweepAngle / 2;
            // Compute every character's position and angle
            PointF[] pntChars = new PointF[_text.Length];
            double[] fCharAngle = new double[_text.Length];
            ComputeCharPos(fCharWidth, pntChars, fCharAngle, fStartAngle);
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            DrawSealBase(g);
            // Draw every character
            for (int i = 0; i < _text.Length; i++)
            DrawRotatedText(g, _text[i].ToString(), (float)(fCharAngle[i] + _degree), pntChars[i]);
            g.Dispose();
            // Return bitmap
            return bit;
        }



        /**//// <summary>
        /// Draw seal base 
        /// </summary>
        /// <param name="g"></param>
        private void DrawSealBase(Graphics g)
        ...{
            // Draw background
            g.FillRectangle(Brushes.Black, _rect);
            g.FillEllipse(new SolidBrush(_fillcolor),
                new Rectangle(1, 1, _rect.Width - 2, _rect.Height - 2));
            g.FillEllipse(Brushes.White,
                new Rectangle(4, 4, _rect.Width - 8, _rect.Height - 8));
            // Draw start signal
            StringFormat sf = new StringFormat();
            string strStar = "★";
            Font fnt = new Font(_font.FontFamily, _font.Size * 3);
            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;
            SizeF siz = g.MeasureString(strStar, fnt);
            g.DrawString(strStar, fnt, new SolidBrush(_fillcolor),
                new RectangleF(_rect.Width / 2 - siz.Width / 2,
            _rect.Height / 2 - siz.Height / 2,
            siz.Width, siz.Height), sf);
            // Draw base string
            float[] fCharWidth = new float[_basestring.Length];
            float fTotalWidths = ComputeStringLength(_basestring, g, fCharWidth, 0,
                Char_Direction.Center);
            float fLeftPos = (_rect.Width - fTotalWidths) / 2;
            PointF pt;
            for (int i = 0; i < _basestring.Length; i++)
            ...{
                pt = new PointF(fLeftPos + fCharWidth[i] / 2,
                _rect.Height / 2 + siz.Height / 2 + 10);
                DrawRotatedText(g, _basestring[i].ToString(), 0, pt);
                fLeftPos += fCharWidth[i];
            }
        }



        /**//// <summary>
        /// Draw every rotated character
        /// </summary>
        /// <param name="g"></param>
        /// <param name="_text"></param>
        /// <param name="_angle"></param>
        /// <param name="_PointCenter"></param>
        private void DrawRotatedText(Graphics g, string _text, float _angle, PointF _PointCenter)
        ...{
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;
            GraphicsPath gp = new GraphicsPath(System.Drawing.Drawing2D.FillMode.Winding);
            int x = (int)_PointCenter.X;
            int y = (int)_PointCenter.Y;
            gp.AddString(_text, _font.FontFamily, (int)_font.Style,
            _font.Size, new Point(x, y), sf);
            Matrix m = new Matrix();
            m.RotateAt(_angle, new PointF(x, y));
            g.Transform = m;
            g.DrawPath(new Pen(_color), gp);
            g.FillPath(new SolidBrush(_fillcolor), gp);
        }
    }

    public enum Char_Direction
    ...{
        Center = 0,
        OutSide = 1,
        ClockWise = 2,
        AntiClockWise = 3,
    }

}



Web 调用方法如下:

 TextOnSeal _top  =   new  TextOnSeal();
        _top.TextFont  =   new  Font( " 宋体 " ,  20 , FontStyle.Regular);
        _top.FillColor  =  Color.Red;
        _top.ColorTOP  =  Color.Black;
        _top.Text  =   " 北京拓创股份有限公司 " ;
        _top.BaseString  =   " 邹氏印章 " ;
        _top.ShowPath  =   true ;
        _top.LetterSpace  =   5 ;
        _top.SealSize  =   220 ;
        _top.CharDirection  =  Char_Direction.Center;
        _top.SetIndent( 20 );
         // Graphics g = this.CreateGraphics();
         // g.DrawImage(_top.TextOnPathBitmap(), 0, 0);
         // 画图初始化
        Bitmap bMap  =   new  Bitmap( 500 ,  500 );
        Graphics gph  =  Graphics.FromImage(bMap);
        gph.Clear(Color.White);
        gph.DrawImage(_top.TextOnPathBitmap(),  0 ,  0 );
         // 保存输出图片
        bMap.Save(Response.OutputStream, ImageFormat.Gif);

显示结果如下:

网页上生成一个印章。相关推荐

  1. 如何在网页上添加一个微信关注链接?(一键跳转微信关注公众号)!!注意是从外部跳到微信关注...

    如何在网页上添加一个微信关注链接?第三方浏览器打开微信的接口,微信只给部分合作平台开放了接口权限,任何第三方想调用只能是通过一些技术手段来请求接口,获取秘钥(ticket).那么如果我们想减少用户从外 ...

  2. Django3在网页上生成二维码

    说明 自用Django3版本,但是百度搜索,搜到的生成二维码的教材都是老版本了,而且用的byteio在django3中也删了,就走了很多歪路. 最后上谷歌搜了一下,发现又更便捷的方法,故分享到这里来 ...

  3. 如何在网页上添加一个微信加好友接口??一键跳转微信添加微信好友的原理!!...

    近期有发现越来越多的广告行业的商家都在寻找如何提升公众号/个人微信吸粉的通道,因为成本暴涨,各个广告渠道又不是很稳定,所以很多人都在咨询如何降低成本.如果采用微信的广告渠道,首先限量其次非常贵,所以只 ...

  4. 如何在网页上生成验证码?

    在平时的网站的注册和登录的时候我们经常会遇到要填写验证码的情况,验证码的存在是保护网站系统的一个良好的方式,今天我就来谈一谈我生成验证码的一些心得. 整体的使用思路: 首先在Servlet的doGet ...

  5. html给看板娘添加语音,如何在网页上插入一个看板娘

    首先准备一个html,放在tomcat的webapps的文件夹下,或者利用Hbuilder(hbuilder内置服务器了的),下载好的文件也放在webapps下 由于看板娘用到ajax技术,而ajax ...

  6. 如何在自己的网页上插入一个超链接,发起临时qq会话

    1.先开通临时会话功能 打开网页http://shang.qq.com/v3/index.html l 立即免费开通 开通之后 将里面这个代码贴到你要用的网页就行 <a target=" ...

  7. 如何在网页上添加一个微信关注链接?(跳转一键关注页)!!!!注意一定是在微信内置浏览器才有效!!!!!

    https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=*********==&scene=110==#wechat_red ...

  8. python web项目导出zip文件_通过javascript在网页端生成zip压缩包并下载

    zip.js是什么 通过zip.js封装一个能在网页端生成zip文件的插件, 直接在网页中创建包含文件夹和文件的压缩包,也可以自定义名字并下载: 如何使用: 1:引用zip.js 2:引用jQuery ...

  9. 网页实现制作一个小日历

    在网页上制作一个日历,利用jquery实现它,其实也不是很困难,参照网上的部分思想自己再深加工,一个精美的日历也就能呈现了 接下来谈谈实现它的函数思想 var date = new Date();va ...

最新文章

  1. 5see我看视频交友客户端 v2.3.0.11官方版
  2. bzoj3507: [Cqoi2014]通配符匹配
  3. 前端:几个操作URL的实用函数
  4. ios和android交互差异,Android 和 iOS 主要交互区别整理
  5. 聚类算法_案例实战:聚类实战
  6. cnn神经网络_神经网络之CNN和RNN
  7. CentOS7 修改静态IP
  8. Cesium:加载本地高程/地形数据
  9. 微信扫码访问网站调用默认浏览器打开如何实现?
  10. QQ产品界面变更之路
  11. 西安奥创软件研究院在博客园的博客开通
  12. 再生龙clonezilla备份系统全过程
  13. visual studio 2008微软教程
  14. 计算机等级考试二级office知识点总结,计算机等级考试二级office知识点总结[共9页].doc...
  15. 雷观(五):认准的事情,要做就做到极致
  16. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A - Wasserstein Distance
  17. (转)十分钟搞懂Lombok使用与原理
  18. 看看您电脑里哪些端口会被入侵?
  19. 泛微JQ绑定check框事件
  20. i.MX8m mini核心板及开发板介绍(MYC-C8MMX)

热门文章

  1. 洗牌一副n张牌,每一张牌都用字母顺序标记。
  2. Excel怎么批量设置行高
  3. 3D人脸建模系统市场现状研究分析-
  4. 删除服务残留注册表_强制卸载软件程序、清理注册表的好工具
  5. 【程序人生】“阶段总结“-幕天席地
  6. iwebshop分销商城系统具体有哪些优势?
  7. R语言 绘图 (ggplot2)
  8. 计算机软考科目众多 我们该如何选择考试科目?
  9. layui upload上传文件时动态设置headers参数值
  10. Java基于JSP+mysql的学科竞赛管理系统