我想编写一段代码,使用.NET框架创建与“Balsamiq Mockups”或“yUML”呈现的图像类似的图像。
有人能告诉我如何使用GDI +实现手绘铅笔效果吗?
显然可以使用正确的字体来完成文本 - 我的问题是如何渲染线条,方框和圆圈。
谢谢!
答案 0 :(得分:4)
GDI +最适合绘制直角型图形,但您可以使用它来产生这样的效果:
alt text http://img7.imageshack.us/img7/3497/crudite.jpg
...使用Graphics对象的 DrawBezier 方法。以下是呈现上述图片的代码段:
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.FillRectangle(new SolidBrush(Color.White),
new Rectangle(0, 0, bmp.Width, bmp.Height));
Pen pen = new Pen(Color.Gray, 7.0F);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.DrawBezier(pen,
new Point(10, 10),
new Point(11, 41),
new Point(7, 147),
new Point(13, 199));
g.DrawBezier(pen,
new Point(7, 10),
new Point(87, 13),
new Point(213, 17),
new Point(319, 6));
g.DrawBezier(pen,
new Point(319, 4),
new Point(305, 53),
new Point(299, 107),
new Point(319, 203));
g.DrawBezier(pen,
new Point(13, 199),
new Point(33, 195),
new Point(150, 207),
new Point(319, 203));
}
pictureBox1.Image = bmp;
此效果的关键是使用宽度较大的笔(本例中为7.0F),并将Graphics对象的SmoothingMode设置为HighQuality(因为这看起来像使用默认的SmoothingMode)。
编写自定义方法相对容易,您可以指定以普通GDI +方式绘制的形状(矩形和坐标以及半径等),然后您的代码将这些元素的行转换为贝塞尔坐标在每个方向上略微改变几个像素的位置。