C# 合并图形对象无法正确渲染文本 我试图用VCL C++应用程序移植自定义控件来解决问题。其思想是首先在新图形对象上绘制控件的各个部分,然后通过控件的绘制方法与图形对象合并
我创建了一个简化的示例:C# 合并图形对象无法正确渲染文本 我试图用VCL C++应用程序移植自定义控件来解决问题。其思想是首先在新图形对象上绘制控件的各个部分,然后通过控件的绘制方法与图形对象合并,c#,winforms,graphics,system.drawing,C#,Winforms,Graphics,System.drawing,我创建了一个简化的示例: using System.Drawing; using System.Windows.Forms; namespace Test { public class Form1 : Form { private PictureBox pictureBox; public Form1() { pictureBox = new PictureBox(); pictu
using System.Drawing;
using System.Windows.Forms;
namespace Test
{
public class Form1 : Form
{
private PictureBox pictureBox;
public Form1()
{
pictureBox = new PictureBox();
pictureBox.Dock = DockStyle.Fill;
pictureBox.Paint += new PaintEventHandler(pictureBox_Paint);
ClientSize = new Size(100, 50);
Controls.Add(pictureBox);
}
private void pictureBox_Paint(object sender, PaintEventArgs e)
{
SolidBrush blackBrush = new SolidBrush(Color.Black);
Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
Graphics graphics = Graphics.FromImage(bitmap);
Font font = new Font(pictureBox.Font, FontStyle.Regular);
graphics.DrawString("simple test", font, Brushes.Black, 0, 0);
e.Graphics.DrawImage(bitmap, 0, 0);
}
}
}
运行上述代码会导致文本绘制过厚:
当我修改代码将文本直接绘制到PictureBox的图形对象时,我得到了正确的结果:
此问题仅在文本呈现时出现。线和其他形状被正确渲染。有什么办法解决这个问题吗
提前感谢。发生这种情况是因为您忘记初始化位图像素。默认情况下,它们是Color.Transparent,即alpha为0的黑色。当您在位图中绘制抗锯齿文本时,这会出错,锯齿算法将绘制从前景(黑色)混合到背景(也是黑色)的像素。结果是没有抗锯齿的斑点状字母 这在第二个屏幕截图中不是问题,因为默认的Form.OnPaintBackground()方法将背景像素绘制为战舰灰色。只需添加Graphics.Clear()方法即可解决问题:
using (var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) {
using (var graphics = Graphics.FromImage(bitmap)) {
graphics.Clear(this.BackColor); // <== NOTE: added
graphics.DrawString("simple test", pictureBox1.Font, Brushes.Black, 0, 0);
}
e.Graphics.DrawImage(bitmap, 0, 0);
}
使用(var bitmap=新位图(pictureBox.Width、pictureBox.Height)){
使用(var graphics=graphics.FromImage(位图)){
graphics.Clear(this.BackColor);//发生这种情况的原因是您忘记初始化位图像素。默认情况下,它们是Color.Transparent,为黑色,alpha为0。在位图中绘制抗锯齿文本时出错,锯齿算法将绘制与前景混合的像素(黑色)背景(也是黑色)。结果是没有抗锯齿的斑点状字母
这在第二个屏幕截图中不是问题,因为背景像素是以默认形式绘制为战舰灰色的。OnPaintBackground()方法。只需添加Graphics.Clear()方法即可解决问题:
using (var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) {
using (var graphics = Graphics.FromImage(bitmap)) {
graphics.Clear(this.BackColor); // <== NOTE: added
graphics.DrawString("simple test", pictureBox1.Font, Brushes.Black, 0, 0);
}
e.Graphics.DrawImage(bitmap, 0, 0);
}
使用(var bitmap=新位图(pictureBox.Width、pictureBox.Height)){
使用(var graphics=graphics.FromImage(位图)){
图形。清晰(此。背景色)//