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

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

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

以下是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);
            Pen pen = new Pen(Color.Blue, 5);
            g.DrawRectangle(pen, rect);          
            path.AddRectangle(rect);
        }

        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";
                }
            }
            
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/haodafeng/p/11636767.html