最近想做一下在图像上编辑图元的工作,需求大概是:
- 显示图像
- 图像可以左右,上下翻转
- 图像可以缩放,旋转,平移
- 图像上添加图元,比如矩形,圆形,直线,不规则图形等
- 鼠标可以选中图元,并对图元进行编辑
- 可以删除选中图元
- 可以计算出图元内包含的像素的一些统计信息。
- 可以实时显示鼠标对应的图像点的值
注:
- 我记得以前好像看到过c#有自带的图元类,可以创建各种图元对象,操作图元对象来实现以上部分需求,可是找了半天也没找到,不知道是不是我记错了。
- 如果各位知道就可以省些力气绘制图元,请留言告诉我类名。
以下是c#实现以上需求的代码,可以执行,但是只是我自己测试功能写的代码,算伪代码吧。
写的比较随意,但思路是对的,稍微加工一下,完全可以满足以上所有需求,网上应该找不到第二个写的比我更全面了。
只是在这里记录一下,以后用到的时候方便快速实现功能。
有这方面需求的朋友可以借鉴,当做是抛砖引玉了。
注意:
- 上下,左右的镜像功能用graphics对象应该无法实现,所以用image的函数来处理,但是用image来处理镜像之后,查找对应点的像素值时除了矩阵变换坐标,还需要额外考虑这个镜像位置。如果你有办法通过矩阵变换实现镜像,欢迎留言。
-
IsOutlineVisible 这个函数真的好,真的好!
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private Graphics g = null; private GraphicsPath path = null; public Form1() { InitializeComponent(); g = this.CreateGraphics(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { path = new GraphicsPath(); var img = Bitmap.FromFile("E:\1570502115(1).png"); //img.RotateFlip(RotateFlipType.RotateNoneFlipX); Point pt = new Point(0, 0); g.TranslateTransform(10, 10, MatrixOrder.Append); g.ScaleTransform((float)1.5 ,(float)1.5); g.RotateTransform(10); g.DrawImage(img, pt); //draw rect Rectangle rect = new Rectangle(20,20,50,50); path.AddRectangle(rect); Rectangle angle = new Rectangle(20,20,50,50); path.AddEllipse(angle);
Pen pen = new Pen(Color.Blue, 5); g.DrawPath(pen,path); } private void Form1_MouseMove(object sender, MouseEventArgs e) { PointF[] ptf = new PointF[1]; ptf[0].X = e.X; ptf[0].Y = e.Y; label4.Text = e.X.ToString(); label5.Text = e.Y.ToString(); g.TransformPoints(CoordinateSpace.World, CoordinateSpace.Device, ptf); label1.Text = ptf[0].X.ToString(); label2.Text = ptf[0].Y.ToString(); if (path != null) { if (path.IsOutlineVisible(ptf[0].X, ptf[0].Y, new Pen(Color.Blue, 5))) { label3.Text = "true"; } else { label3.Text = "false"; } } } } }