C# GDI绘图中文字镜像的简单解决方法

最近在做GDI绘图,发现用GDI绘图,坐标变化后会导致在进行绘制文字时,会导致文字“镜像”,简单的解决思路如下:

1.简单GDI绘图,如下所示:

 private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;

            Pen pen = new Pen(Color.Red);
            pen.EndCap = LineCap.ArrowAnchor;

            Font font = new Font("宋体", 18, FontStyle.Bold);
            Brush brush = new SolidBrush(Color.Blue);

            graphics.TranslateTransform(20, 20);    //将坐标变化到(20,20)
            graphics.DrawLine(pen, 0, 0, 100, 0);  
            graphics.DrawLine(pen, 0, 0, 0, 100);

            graphics.DrawString("你好", font, brush, 30, 30);

          
        }

2.下面进行这样坐标处理后会变成如下:

  private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;

            Pen pen = new Pen(Color.Red);
            pen.EndCap = LineCap.ArrowAnchor;

            Font font = new Font("宋体", 18, FontStyle.Bold);
            Brush brush = new SolidBrush(Color.Blue);

            graphics.TranslateTransform(20, 20);    //将坐标变化到(20,20)
            graphics.DrawLine(pen, 0, 0, 100, 0);  
            graphics.DrawLine(pen, 0, 0, 0, 100);
            graphics.DrawString("你好", font, brush, 30, 30);

            GraphicsState graphicsState = graphics.Save();//保存当前的坐标变化,相当于graphics可以从新在设置坐标变化

            graphics.TranslateTransform(300, 300);
            graphics.ScaleTransform(1, -1);             //主要导致镜像的坐标变化

            graphics.DrawLine(pen, 0, 0, 200, 0);
            graphics.DrawLine(pen, 0, 0, 0, 200);
            string s = "你好";
            graphics.DrawString(s, font, brush, 50, 50);

            
        }

 

3.解决办法

不使用DrawString,而利用DrawImage的方式绘制文字,
首先利用下面的方法将文字绘制为Image的形式。
  private Image BulidImage(string text, Font font, Brush brush)
        {
            Image image = new Bitmap(50, 50);        //实例化一个Image对象
            var g = Graphics.FromImage(image);     //创建画布
            g.Clear(Color.Transparent);                    //设置画布背景颜色
            //设置画布坐标变化
            g.TranslateTransform(image.Height / 2, image.Width / 2);
            g.ScaleTransform(1f, -1f);
            //设置画布上文字效果,去除锯齿影响
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            //获取绘制字体大小
            var size = g.MeasureString(text, font);
            g.DrawString(text, font, brush, -size.Width / 2, -size.Height / 2);
            return image;
        }

总代码:

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;

            Pen pen = new Pen(Color.Red);
            pen.EndCap = LineCap.ArrowAnchor;

            Font font = new Font("宋体", 18, FontStyle.Bold);
            Brush brush = new SolidBrush(Color.Blue);

            graphics.TranslateTransform(20, 20);    //将坐标变化到(20,20)
            graphics.DrawLine(pen, 0, 0, 100, 0);  
            graphics.DrawLine(pen, 0, 0, 0, 100);
            graphics.DrawString("你好", font, brush, 30, 30);

            GraphicsState graphicsState = graphics.Save();//保存当前的坐标变化,相当于graphics可以从新在设置坐标变化

            graphics.TranslateTransform(300, 300);
            graphics.ScaleTransform(1, -1);             //主要导致镜像的坐标变化

            graphics.DrawLine(pen, 0, 0, 200, 0);
            graphics.DrawLine(pen, 0, 0, 0, 200);
            string s = "你好";

         //   graphics.DrawString(s, font, brush, 50, 50);

            Image image = BulidImage(s, font, brush);
            graphics.DrawImage(image, 50, 50); //绘制图片的方式
        }




初次接触,不足之处,还望见谅!

 

posted @ 2019-12-01 20:42  阿贝尔  阅读(1251)  评论(1)    收藏  举报