GDI+画电子印章

使用GDI+画一个电子印章,初次使用,请多多指教。

以下是Form代码,大家应该都会用,项目文件就不上传了。

效果图

  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            pictureBox1.Size = new Size(W + penWith , W + penWith);
        }
        /// <summary>
        /// 画笔宽度
        /// </summary>
        const int penWith = 4;

        const int W = 200;
        const int H = W;
        /// <summary>
        /// 半径
        /// </summary>
        const int Radius = W / 2;
        /// <summary>
        /// 直径
        /// </summary>
        const int Diameter = W;
        /// <summary>
        /// 公司名字体
        /// </summary>
        Font f = new System.Drawing.Font("宋体", 24, FontStyle.Bold);
        /// <summary>
        /// 公司号码字体
        /// </summary>
        Font nf = new System.Drawing.Font("宋体", 9, FontStyle.Bold);

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = Creat();
        }

        Bitmap Creat()
        {
            //创建位图
            Bitmap bt = new Bitmap(W + penWith, H + penWith );
            //创建画板
            Graphics g = Graphics.FromImage(bt);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除绘制图形的锯齿
            g.Clear(Color.White);//以白色清空背景
            //文本反锯齿
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Pen p = new System.Drawing.Pen(Color.Red, penWith);
            Rectangle rec = new Rectangle(new System.Drawing.Point(penWith, penWith), new Size(W - penWith * 2, H - penWith * 2));
            rec = new Rectangle(penWith/2, penWith/2, W, W);
            //画外接正方形
            //g.DrawRectangle(new Pen(Color.Black, penWith), rec);
            g.DrawEllipse(new Pen(Color.Red, penWith), rec);
            string star = "★";
            Font star_Font = new Font("宋体", 50, FontStyle.Regular);//设置星号的字体样式
            SizeF star_Size = g.MeasureString(star, star_Font);//对指定字符串进行测量
            //要指定的位置绘制星号
            PointF star_xy = new PointF(W / 2 - star_Size.Width / 2, W / 2 - star_Size.Height / 2);
            g.DrawString(star, star_Font, Brushes.Red, star_xy);
            //设置坐标原点为圆心
            g.TranslateTransform(Radius, Radius);
            //画十字
            //g.DrawLine(p, 0, -Radius, 0, Radius);
            //g.DrawLine(p, -Radius, 0, Radius, 0);
            string name = "众达电子(美国)有限公司";
            int total=0;
            for (int i = 0; i < name.Length; i++)
            {
                string str = name[i].ToString();
                if (str == "(" || str == ")")//对于括号特殊处理,使文本更加紧凑
                {
                    total += 18;
                }
                else
                {
                    total += 24;
                }
            }
            total -= 34;//偏移量矫正
            g.RotateTransform(-total/2);//坐标系旋转
            for (int i = 0; i < name.Length; i++)
            {
                //此循环每次都是画字符到坐标系的正上方,每次画完后旋转相应角度
                string str = name[i].ToString();
                SizeF sf = g.MeasureString(str, f);
                g.DrawString(str, f, Brushes.Red, -sf.Width / 2, -Radius + sf.Height / 8);
                if ((str == ")") || (i < name.Length - 2 && name[i + 1].ToString() == ")")||(str == "(") || (i < name.Length - 2 && name[i + 1].ToString() == "("))//发现当前是括号或者下一个是括号,则移动角度小点
                {
                    g.RotateTransform(18);
                }
                else
                {
                    g.RotateTransform(24);
                }
            }
            g.ResetTransform();
            g.TranslateTransform(Radius, Radius);
            string num = "3105345027698";

            int numRotate = 7;
            g.RotateTransform(numRotate * num.Length / 2 - numRotate/2);

            for (int i = 0; i < num.Length; i++)
            {
                //此循环每次都是画字符到坐标系的正上方,每次画完后旋转相应角度
                string str = num[i].ToString();
                SizeF sf = g.MeasureString(str, nf);
                g.DrawString(str, nf, Brushes.Red, 0-sf.Width/2, Radius - sf.Height);
                g.RotateTransform(-numRotate);
            }
            g.Save();
            g.Dispose();
            return bt;
        }

    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 12:18:00

GDI+画电子印章的相关文章

GDI+ 画渐变色环

在onpaint() 函数中加入如下代码,本次利用DrawArc来实现. #define PI 3.1415926 int angle=360; int x=(rect.Width()-300)/2; int y=190; int width=300; int hight=300; int wide=34; graphics.SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿 for(float i = 0.0; i < PI; i += (float)

openCV 和GDI画线效率对照

一. 因为项目须要,原来用GDI做的画线的功能.新的项目中考虑到垮平台的问题.打算用openCV来实现.故此做个效率对照. 二. 2点做一条线,来測试效率. 用了相同的画板大小---256*256的大小,函数通过參数输入.用GetTickCount来实现计时功能. 三. GDI的主要循代码例如以下: void show_line(int line_num,int point_num) { ULONAG start_time = get_tick_count(); VMGdiPolygon* te

用GDI+画验证码

1.新建一个窗体应用程序,在上面拖一个pictureBox对象,为其添加单击事件 2.创建GDI对象.产生随机数画入图片中.画线条.最后将图片到pictureBox中,代码如下: 1 private void pictureBox1_Click(object sender, EventArgs e) 2 { 3 //创建GDI对象 4 Bitmap bmp = new Bitmap(150,40); 5 Graphics g = Graphics.FromImage(bmp); 6 7 //产生

openCV 和GDI画线效率对比

一. 由于项目需要,原来用GDI做的画线的功能,新的项目中考虑到垮平台的问题,打算用openCV来实现,故此做个效率对比. 二. 2点做一条线,来测试效率. 用了同样的画板大小---256*256的大小,函数通过参数输入,用GetTickCount来实现计时功能. 三. GDI的主要循代码如下: void show_line(int line_num,int point_num) { ULONAG start_time = get_tick_count(); VMGdiPolygon* test

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息. GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选. 一.              GDI+的特点和新增功能 GDI+与GDI一样,都具有设备无关性.应用程序的程序员可利用GDI+这样

vc++加载透明png图片方法——GDI+和CImage两种

vc++加载透明png图片方法——GDI+和CImage两种 在加载png时遇到了麻烦,后来用了两个方法解决了.一个是用GDI+,另外就是用vs.net MFC自带的CImage. 先看看GDI+的方法 方法1: 1.GDI+画透明图层(alpha)的png图片 stdafx加入如下: #include <comdef.h>//初始化一下com口 #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(li

15-03-16 GUID画验证码

GDI+就是用来画图的;炒股软件,心电图等都是GDI画的,GDI不是.net的技术,他是一个单独的技术 private void Form1_Load(object sender, EventArgs e)        {            //画图需要一根笔,颜色 一张纸,两点,绘制直线的对象            //纸就是窗体,绘制直线的对象就是GDI对象        } private void button1_Click(object sender, EventArgs e) 

GPU渲染和GDI

要实现这样一段逻辑,用GPU画3D图,用GDI画二维图元,怎么样效率高.相传Vista年代,是这样干的: 硬件渲染的东西在GPU上做完 读回CPU端 把GDI这些用软件渲染 两者混合 拷贝到显存显示 这样的话,相当于整个屏幕都要维持2份拷贝,并且要互相同步.早期的vista驱动上,D3D/OGL和GDI混合使用的话闪得要死或者慢的要死,就是这个原因. 于是新的wddm要求驱动提供overlay和blt,所以流程变得很简单高效: 硬件渲染的东西在GPU上做完 把GDI这些用软件渲染 BitBlt到

最简单的视音频播放示例2:GDI播放YUV, RGB

前一篇文章对"Simplest Media Play"工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和它们属于同一层面的的简单的技术--GDI作为热身. GDI简介 下面这段文字摘自维基百科: 图形设备接口(Graphics Device Interface或Graphical Device Interface,缩写GDI),是微软公司视窗操作系统(Microsoft Windows)的三