Graphics.DrawString的一些问题

wal613 2013-08-10 01:03:51
在用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号以上时,画布上文本周围的杂色消除,不知何因。

以上两个问题,不知道什么原因。。。希望高手解答!
...全文
879 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2013-08-12
  • 打赏
  • 举报
回复
是啊我知道啊,那很正常啊。因为字体边缘会向背景色平滑过滤,这样看起来来才比较“光滑”,bmp缺省的背景是(透明)黑色,所以字的边缘会有一圈接近黑色的过度。 你自己不是也测试了,设置TextRenderingHint=SingleBitPerPixel,这时候字体就是纯色的,但是边缘会显得很粗糙。
wal613 2013-08-12
  • 打赏
  • 举报
回复
引用 10 楼 jshi123 的回复:
为什么我这里看出效果没有你说的现象? 代码是一样的

	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();
	}
把背景去掉,你再试试,肯定有杂色的。
jshi123 2013-08-11
  • 打赏
  • 举报
回复
为什么我这里看出效果没有你说的现象? 代码是一样的

	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();
	}
wal613 2013-08-10
  • 打赏
  • 举报
回复
引用 7 楼 hwenycocodq520 的回复:
[quote=引用 6 楼 hwenycocodq520 的回复:] "填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black" MakeTransparent此方法可以使指定颜色对位图透明,绘制文字光栅过程会出现锯齿,其中与透明色渐进的颜色并不能透明化,所以就会出现一些小黑点围绕这些文字
上面说的不正确: MSDN http://msdn.microsoft.com/zh-cn/library/9t6sa8s9(v=vs.80).aspx[/quote] 这么晚了还来回答问题,真的十分感谢! 解决方法是将在DrawString之前,设置Graphics g的属性TextRenderingHint为SingleBitPerPixel,然后MakeTransparent方法时,就没有杂色了。但这样就没有了锯齿的效果,文字看上去不是很清楚,不知道有没有其他的解决方法。
智商余额不足 2013-08-10
  • 打赏
  • 举报
回复
引用 6 楼 hwenycocodq520 的回复:
"填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black" MakeTransparent此方法可以使指定颜色对位图透明,绘制文字光栅过程会出现锯齿,其中与透明色渐进的颜色并不能透明化,所以就会出现一些小黑点围绕这些文字
上面说的不正确: MSDN http://msdn.microsoft.com/zh-cn/library/9t6sa8s9(v=vs.80).aspx
智商余额不足 2013-08-10
  • 打赏
  • 举报
回复
"填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black" MakeTransparent此方法可以使指定颜色对位图透明,绘制文字光栅过程会出现锯齿,其中与透明色渐进的颜色并不能透明化,所以就会出现一些小黑点围绕这些文字
智商余额不足 2013-08-10
  • 打赏
  • 举报
回复
g.Clear(控件背景色); g.DrawString //这句可以删了 //bit.MakeTransparent(Color.Black);
wal613 2013-08-10
  • 打赏
  • 举报
回复
自己顶一贴。。。。 求其他解决方案啊。。。 为什么在窗体上直接绘制字符串时,没有这种情况啊,求解!
wal613 2013-08-10
  • 打赏
  • 举报
回复
引用 1 楼 stonespace 的回复:
x.DrawImage(bit, new Point(100, 50));这句话可能导致图片变形或者拉伸,精度损失等问题,Image bit = new Bitmap(100, 50);有像素格式的问题,可能bitmap的像素格式和 控件的像素格式不匹配,在DrawImage的时候导致失真,
x.DrawImage(bit, new Point(100, 50));这句话只是将图片绘制到窗体上,应该是按照原来的大小绘制的,所以应该不是因为精度损失等问题造成的。 另外,当把这个bit用Save()的方法时,其保存的图片仍然会有其他杂色。 3L所说的按照窗体的背景色绘制确实没有问题,但按照其他背景色绘制还是存在问题,可能正如您所说的和Bitmap bit的像素格式有关,但应该与控件的像素格式没什么联系,因为这个是在内存中绘制的,而且保存到图片的时候,图片中仍然有杂色。 个人觉得DrawString的PixelFormat和Bitmap的PixelFormat之间的转换存在着一些问题,但Graphics中并没有相关的属性,具体原因还是不太清楚。。。
wal613 2013-08-10
  • 打赏
  • 举报
回复
引用 2 楼 hwenycocodq520 的回复:

//默认构造的位图背景色是黑色的
Image bit = new Bitmap(100, 50);
Graphics g = Graphics.FromImage(bit);
//用窗体背景色填充,再绘制字符串就得到和直接在窗体绘制的一样的了
g.Clear(this.BackColor);
//
//
这个方法在窗体上确实可以解决,那么如果以其他颜色填充的话,为什么还会有杂色呢。 比如,填充的是Color.Black,字体颜色为Color.White,去除的时候用Color.Black,发现字符串还是很模糊,有其他颜色。请问这有什么解决的方法吗?
智商余额不足 2013-08-10
  • 打赏
  • 举报
回复

//默认构造的位图背景色是黑色的
Image bit = new Bitmap(100, 50);
Graphics g = Graphics.FromImage(bit);
//用窗体背景色填充,再绘制字符串就得到和直接在窗体绘制的一样的了
g.Clear(this.BackColor);
//
//
stonespace 2013-08-10
  • 打赏
  • 举报
回复
x.DrawImage(bit, new Point(100, 50));这句话可能导致图片变形或者拉伸,精度损失等问题,Image bit = new Bitmap(100, 50);有像素格式的问题,可能bitmap的像素格式和 控件的像素格式不匹配,在DrawImage的时候导致失真,

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧