Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并图形对象无法正确渲染文本 我试图用VCL C++应用程序移植自定义控件来解决问题。其思想是首先在新图形对象上绘制控件的各个部分,然后通过控件的绘制方法与图形对象合并_C#_Winforms_Graphics_System.drawing - Fatal编程技术网

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(位图)){
图形。清晰(此。背景色)//