在用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号以上时,画布上文本周围的杂色消除,不知何因。以上两个问题,不知道什么原因希望高手解答!
{
//画布
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号以上时,画布上文本周围的杂色消除,不知何因。以上两个问题,不知道什么原因希望高手解答!
//默认构造的位图背景色是黑色的
Image bit = new Bitmap(100, 50);
Graphics g = Graphics.FromImage(bit);
//用窗体背景色填充,再绘制字符串就得到和直接在窗体绘制的一样的了
g.Clear(this.BackColor);
//
//
这个方法在窗体上确实可以解决,那么如果以其他颜色填充的话,为什么还会有杂色呢。
比如,填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black,发现字符串还是很模糊,有其他颜色。请问这有什么解决的方法吗?
另外,当把这个bit用Save()的方法时,其保存的图片仍然会有其他杂色。
3L所说的按照窗体的背景色绘制确实没有问题,但按照其他背景色绘制还是存在问题,可能正如您所说的和Bitmap bit的像素格式有关,但应该与控件的像素格式没什么联系,因为这个是在内存中绘制的,而且保存到图片的时候,图片中仍然有杂色。
个人觉得DrawString的PixelFormat和Bitmap的PixelFormat之间的转换存在着一些问题,但Graphics中并没有相关的属性,具体原因还是不太清楚
g.DrawString
//这句可以删了
//bit.MakeTransparent(Color.Black);
上面说的不正确:
MSDN
http://msdn.microsoft.com/zh-cn/library/9t6sa8s9(v=vs.80).aspx
上面说的不正确:
MSDN
http://msdn.microsoft.com/zh-cn/library/9t6sa8s9(v=vs.80).aspx这么晚了还来回答问题,真的十分感谢!
解决方法是将在DrawString之前,设置Graphics g的属性TextRenderingHint为SingleBitPerPixel,然后MakeTransparent方法时,就没有杂色了。但这样就没有了锯齿的效果,文字看上去不是很清楚,不知道有没有其他的解决方法。
{
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();
}
你自己不是也测试了,设置TextRenderingHint=SingleBitPerPixel,这时候字体就是纯色的,但是边缘会显得很粗糙。