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); //绘制图片的方式 }

初次接触,不足之处,还望见谅!
浙公网安备 33010602011771号