采用正确方式在PictureBox绘图导致输出效果变差的问题咨询
问题分析与解决方案
我明白你遇到的困扰了——改用Bitmap绘图后,PictureBox的显示效果反而不如之前直接用PictureBox.CreateGraphics()的方式,明明两者的DPI都是96,但显示差异却很明显。核心原因其实是两种方式创建的Graphics对象,默认的绘图质量参数完全不一样。
问题根源
直接从PictureBox创建的Graphics会自动继承系统的高质量绘图配置(比如文本抗锯齿、图形边缘平滑),但从Bitmap创建的Graphics默认采用的是基础级别的设置,这就导致了文本和图形的显示效果打折扣,哪怕DPI数值一致也没用。
解决方案
只要在从Bitmap创建Graphics之后,手动开启高质量绘图参数,让它和PictureBox的Graphics设置对齐,就能同时保证显示效果和打印输出一致了。
修改你的代码如下,添加关键的质量配置:
public partial class Form1 : Form { private bool Correctway; public Form1() { InitializeComponent(); button1.Click += Button1_Click; } private void Button1_Click(Object sender, EventArgs e) { PrintPageEventArgs eOutput; Graphics g; string OutputText; Font PrintFont; Bitmap Output; //Correctway = true; OutputText = "CERTIFICATION"; PrintFont = new Font("Arial", 16, FontStyle.Regular); Output = new Bitmap(850, 1100); if (Correctway) { g = Graphics.FromImage(Output); // 开启高质量绘图设置,和PictureBox的Graphics配置对齐 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; } else g = pictureBox1.CreateGraphics(); eOutput = new PrintPageEventArgs(g, new Rectangle(new Point(25, 25), new Size(new Point(825, 1075))), new Rectangle(new Point(0, 0), new Size(new Point(850, 1100))), new PageSettings()); eOutput.Graphics.DrawString(OutputText, PrintFont, Brushes.Black, 0, 0); eOutput.Graphics.DrawRectangle(Pens.Gray, 20, 30, Output.Width - 100, Output.Height - 130); if (Correctway) pictureBox1.Image = Output; } }
关键参数说明
TextRenderingHint.AntiAliasGridFit:让文本边缘抗锯齿的同时对齐像素网格,保证文字清晰平滑;SmoothingMode.AntiAlias:让绘制的图形(比如你代码里的灰色矩形)边缘更柔和,避免出现锯齿;PixelOffsetMode.HighQuality:优化像素偏移逻辑,提升整体显示精度;CompositingQuality.HighQuality:提升图像合成时的色彩和细节表现。
额外提醒
之前用PictureBox.CreateGraphics()的方式其实存在隐患——一旦窗体被重绘(比如最小化后恢复、拖动窗口),绘制的内容会直接消失。而用Bitmap赋值给PictureBox.Image的方式是持久化的,才是正确的实现方式,加上上述质量设置后,就能完美达到你想要的“显示效果和打印一致”的目标了。
内容的提问来源于stack exchange,提问作者Github
相关产品推荐
相关产品推荐

