导航

如何在图像上添加图元并编辑

Posted on 2019-10-08 17:30  好大风~  阅读(394)  评论(0编辑  收藏  举报

最近想做一下在图像上编辑图元的工作,需求大概是:

  1. 显示图像
  2. 图像可以左右,上下翻转
  3. 图像可以缩放,旋转,平移
  4. 图像上添加图元,比如矩形,圆形,直线,不规则图形等
  5. 鼠标可以选中图元,并对图元进行编辑
  6. 可以删除选中图元
  7. 可以计算出图元内包含的像素的一些统计信息。
  8. 可以实时显示鼠标对应的图像点的值

注:

  1. 我记得以前好像看到过c#有自带的图元类,可以创建各种图元对象,操作图元对象来实现以上部分需求,可是找了半天也没找到,不知道是不是我记错了。
  2. 如果各位知道就可以省些力气绘制图元,请留言告诉我类名。

 

以下是c#实现以上需求的代码,可以执行,但是只是我自己测试功能写的代码,算伪代码吧。

写的比较随意,但思路是对的,稍微加工一下,完全可以满足以上所有需求,网上应该找不到第二个写的比我更全面了。

只是在这里记录一下,以后用到的时候方便快速实现功能。

有这方面需求的朋友可以借鉴,当做是抛砖引玉了。

注意:

  1. 上下,左右的镜像功能用graphics对象应该无法实现,所以用image的函数来处理,但是用image来处理镜像之后,查找对应点的像素值时除了矩阵变换坐标,还需要额外考虑这个镜像位置。如果你有办法通过矩阵变换实现镜像,欢迎留言。
  2. 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"; } } } } }