winfrom在图片上实现绘制
2021-05-03 03:27
标签:dbr rgs none rom 结束 jin near size table 首先就是要确定输入的文字,还有文字的样式。 文字的样式用到了FontDialog控件,获取文字呢,就放个textbox就可以了。如果在输入文字的显示展示文字样式可以TextBox.Font = FontDialog.Font; fontDialog1.ShowColor = true; 这样fontdialog控件就可以选择字体颜色了。 if (this.fontDialog1.ShowDialog() == DialogResult.OK) 这个 if 判断的是在用户选择字体样式并点击了确定之后。 这里实现这个功能的原理,首先当然还是需要一个image图片对象,可以用image或bitmap。然后以这个对象创建一个画布Graphics.FromImage(image); 在初始化一个画笔对象new SolidBrush(this.fontDialog1.Color),这里将画笔的颜色设置为字体样式的颜色。 然后通过画布的 .DrawString()方法在画布的制定位置绘制指定的文本字符串。 画完之后要将绘制的文本显示在图像上,需要通过图片容器pictureBox1.Refresh()方法重绘控件。 因为这个画布是根据这个图片对象创建的,但并不是再次创建一个图片,而是在这个图片对象上进行绘制。所以在控件刷新之后,就会显示绘制后的图片。 再就是需要确定要将文本绘制到图片的那个位置 这里就需要确定鼠标的坐标,鼠标点在那里就让文本显示在哪里。 这里使用了picturebox控件的鼠标抬起事件,就是在鼠标在控件上按下抬起之后就会触发。记录一个Point点。 和添加文字差不多,也是首先确定线段的粗细,颜色,在确定绘制线段的位置。因为是线段所以需要确定两点Point。 线段的粗细使用textbox让用户输入数字来获取,颜色通过ColorDialog控件,两点的位置通过两个事件来获取,初始点pt0通过鼠标的按下事件,结束点pt1通过抬起事件 但是还有一个问题,就是这样在确定两点然后绘制成功之前,用户是看不见线段的,所以需要通过鼠标移动事件来实时显示线段的状态。 在用户点下鼠标得到pt0之后,当鼠标移入picturebox控件后就记录鼠标在控件中移动的坐标并绘制线段,因为是鼠标移动就会触发所以会持续绘制,此时就不需要用Refreah()刷新控件了。不然会把鼠标移动所产生的每一条线都记录下来。最后在鼠标停止确定在一个点绘制后鼠标按键抬起,此时记录最后的坐标并绘制线段。并且根据初始与结束两点计算距离。 绘制角度我用的 方法就是绘制两条线段。 先绘制一条,再根据角度旋转pt1点,然后连接pt0和新得到的pt2; 嗯,也可以选择线段的颜色,粗细默认是2,根据之前计算得到的图片缩放比例改变。 也是先确定pt0,然后鼠标移动事件中不停绘制线段显示,知道鼠标抬起记录pt1和pt2,然后刷新控件。 winfrom在图片上实现绘制 标签:dbr rgs none rom 结束 jin near size table 原文地址:http://www.cnblogs.com/big-lll/p/7747050.html在控件加载入图片的基础上进行绘制内容
添加文字
{
}private void pictureBox1_MouseUp(object sender, MouseEventArgs e)//这里这个鼠标抬起事件里参数,e就是鼠标的对象,可以通过这个e获取坐标
if 添加线段
if (this.pictureBox1.Image.Width 1)
{
return;
}
if (!string.IsNullOrEmpty(btn))
{
pt0 = new Point(e.X, e.Y);
}
else
{
MessageBox.Show("请确定操作");
}
if (btn == "画线")
{
if (txt_tjsz.Text.Length > 0 && txt_tjsz.Text != "填入线段粗细数(1~9)")
{
pt1 = new Point(e.X, e.Y);
try
{
if (banjing(pt0, pt1) == 0)
{
return;
}
if (xian)
{
pictureBox1.Image = DrawLineInPicture1(pic, pt0, pt1, colorDialog1.Color, 2, DashStyle.Solid);//画线的方法
}
else
{
pictureBox1.Image = DrawLineInPicture1(pic, pt0, pt1, colorDialog1.Color, 2, DashStyle.Dash);//最后一个参数为线段的样式
}
}
catch (Exception ex)
{
pt0 = new Point(0);
MessageBox.Show("操作失败 " + ex.Message, "提示");
}
}
}
///
鼠标MouseUp事件
if (btn == "画线")
{
if (txt_tjsz.Text.Length > 0 && txt_tjsz.Text != "填入线段粗细数(1~9)")
{
if (banjing(pt0, pt1) == 0)
{
return;
}
if (xian)
{
pictureBox1.Image = DrawLineInPicture(pic, pt0, pt1, colorDialog1.Color, Convert.ToInt32(txt_tjsz.Text), DashStyle.Solid);
}
else
{
pictureBox1.Image = DrawLineInPicture(pic, pt0, pt1, colorDialog1.Color, Convert.ToInt32(txt_tjsz.Text), DashStyle.Dash);
}
this.pictureBox1.Refresh();
Point cp = new Point((pt1.X - pt0.X) / 2, (pt1.Y - pt0.Y) / 2);
Point np = new Point(cp.X + pt0.X, cp.Y + pt0.Y);//算出线段的中心点
//计算出说话线段的长度
Graphics gra = Graphics.FromImage(this.pictureBox1.Image);//要进行处理的对象
SolidBrush brush = new SolidBrush(colorDialog1.Color);//初始化画笔
gra.DrawString(banjing(pt0, pt1).ToString(), this.fontDialog2.Font, brush, np.X / Xsfbl, np.Y / Ysfbl);//处理图片
this.pictureBox1.Refresh();//对显示图片的容器里面的控件刷新,以便及时显示添加的文字(控件中的图像为对象的时候)
bitlist.Add(new Bitmap(this.pictureBox1.Image));
pt0 = new Point(0);
}
} 绘制角度
if (btn == "画角")
{
if (txt_tjsz.Text.Length > 0&& txt_tjsz.Text != "填入角度度数")
{
pt1 = new Point(e.X, e.Y);
pictureBox1.Image = DrawLineInPicture1(pic, pt0, pt1, colorDialog1.Color, 2, DashStyle.Solid);
Point pt2 = GetNewPoint(Convert.ToInt32(txt_tjsz.Text), pt0, pt1);
pictureBox1.Image = DrawLineInPicture1(pic, pt0, pt2, colorDialog1.Color, 2, DashStyle.Solid);
}
else
{
pt0 = new Point(0);
MessageBox.Show("请填写角度", "提示");
}
}
if (btn == "画角")
{
if (txt_tjsz.Text.Length > 0 && txt_tjsz.Text != "填入角度度数")
{
pt1 = new Point(e.X, e.Y);
pictureBox1.Image = DrawLineInPicture(pic, pt0, pt1, colorDialog1.Color, Convert.ToInt32(2/Xsfbl), DashStyle.Solid);
//pictureBox1.Refresh();//刷新控件绘制角的第一条线
//bitlist.Add(new Bitmap(this.pictureBox1.Image));
Point pt2 = GetNewPoint(Convert.ToInt32(txt_tjsz.Text), pt0, pt1);//顺时针
pictureBox1.Image = DrawLineInPicture(pic, pt0, pt2, colorDialog1.Color, Convert.ToInt32(2 / Xsfbl), DashStyle.Solid);
pictureBox1.Refresh();//刷新控件绘制角的第二条线
bitlist.Add(new Bitmap(this.pictureBox1.Image));
pt0 = new Point(0);
}
else
{
pt0 = new Point(0);
MessageBox.Show("请填写角度", "提示");
}
上一篇:【C#】绝对随机数