在用Graphics.DrawString()这个方法绘制字符串的时候,绘制在控件上的字符串效果和绘制到Bitmap中的效果不一样,如下图所示:其代码如下所示:private void button1_Click(object sender, EventArgs e)
        {
            //画布
            Image bit = new Bitmap(100, 50);
            //在画布上绘出字符串
            Graphics g = Graphics.FromImage(bit);         
            //g.Clear(Color.Black);
            g.DrawString("1234567", new Font("Arial", 12), new SolidBrush(Color.Gold), new PointF(0, 0));
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.Dispose();
            //bit.MakeTransparent(Color.Black);
            Graphics x = this.CreateGraphics();
            //将画布绘制到控件上
            x.DrawImage(bit, new Point(100, 50));
            //将字符串直接绘制到控件上
            x.DrawString("123567", new Font("Arial", 12), new SolidBrush(Color.Gold), new PointF(100, 80));
            x.Dispose();
            bit.Dispose();
        }
从图中发现一下两个问题:
1.相同代码下,画到画布上的字符串采用了粗体,而直接绘制到控件上的则是普通文本。
2.画布上的字符串周围很不清楚,而且字体颜色不一样,周围颜色也不一样,而控件上直接绘制出的文本很清晰。另外,当字体大小设置到72号以上时,画布上文本周围的杂色消除,不知何因。以上两个问题,不知道什么原因希望高手解答!

解决方案 »

  1.   

     x.DrawImage(bit, new Point(100, 50));这句话可能导致图片变形或者拉伸,精度损失等问题,Image bit = new Bitmap(100, 50);有像素格式的问题,可能bitmap的像素格式和 控件的像素格式不匹配,在DrawImage的时候导致失真,
      

  2.   


    //默认构造的位图背景色是黑色的
    Image bit = new Bitmap(100, 50);
    Graphics g = Graphics.FromImage(bit);
    //用窗体背景色填充,再绘制字符串就得到和直接在窗体绘制的一样的了
    g.Clear(this.BackColor);
    //
    //
      

  3.   


    这个方法在窗体上确实可以解决,那么如果以其他颜色填充的话,为什么还会有杂色呢。
    比如,填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black,发现字符串还是很模糊,有其他颜色。请问这有什么解决的方法吗?
      

  4.   

    x.DrawImage(bit, new Point(100, 50));这句话只是将图片绘制到窗体上,应该是按照原来的大小绘制的,所以应该不是因为精度损失等问题造成的。
    另外,当把这个bit用Save()的方法时,其保存的图片仍然会有其他杂色。
    3L所说的按照窗体的背景色绘制确实没有问题,但按照其他背景色绘制还是存在问题,可能正如您所说的和Bitmap bit的像素格式有关,但应该与控件的像素格式没什么联系,因为这个是在内存中绘制的,而且保存到图片的时候,图片中仍然有杂色。
    个人觉得DrawString的PixelFormat和Bitmap的PixelFormat之间的转换存在着一些问题,但Graphics中并没有相关的属性,具体原因还是不太清楚
      

  5.   

    g.Clear(控件背景色);
    g.DrawString
    //这句可以删了
    //bit.MakeTransparent(Color.Black); 
      

  6.   

    "填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black"MakeTransparent此方法可以使指定颜色对位图透明,绘制文字光栅过程会出现锯齿,其中与透明色渐进的颜色并不能透明化,所以就会出现一些小黑点围绕这些文字
      

  7.   


    上面说的不正确:
    MSDN
    http://msdn.microsoft.com/zh-cn/library/9t6sa8s9(v=vs.80).aspx
      

  8.   


    上面说的不正确:
    MSDN
    http://msdn.microsoft.com/zh-cn/library/9t6sa8s9(v=vs.80).aspx这么晚了还来回答问题,真的十分感谢!
    解决方法是将在DrawString之前,设置Graphics g的属性TextRenderingHint为SingleBitPerPixel,然后MakeTransparent方法时,就没有杂色了。但这样就没有了锯齿的效果,文字看上去不是很清楚,不知道有没有其他的解决方法。
      

  9.   

    为什么我这里看出效果没有你说的现象?代码是一样的 private void button1_Click(object sender, EventArgs e)
    {
    Image bit = new Bitmap(100, 50);
    Graphics g = Graphics.FromImage(bit);
    g.Clear(Color.Black);
    g.DrawString("1234567", new Font("Arial", 12), new SolidBrush(Color.Gold), new PointF(0, 0));
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    g.Dispose();
    Graphics x = this.CreateGraphics();
    x.DrawImage(bit, new Point(100, 50));
    x.DrawString("1234567", new Font("Arial", 12), new SolidBrush(Color.Gold), new PointF(100, 80));
    x.Dispose();
    bit.Dispose();
    }
      

  10.   

    是啊我知道啊,那很正常啊。因为字体边缘会向背景色平滑过滤,这样看起来来才比较“光滑”,bmp缺省的背景是(透明)黑色,所以字的边缘会有一圈接近黑色的过度。
    你自己不是也测试了,设置TextRenderingHint=SingleBitPerPixel,这时候字体就是纯色的,但是边缘会显得很粗糙。