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


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

    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"; } } } } }
  • 相关阅读:
    性能分析
    thymeleaf和spring的整合
    Java中二叉树的建立
    面试题
    (转)structs2的相关配置问题
    ==与equal()的区别
    java的基本类型和其包装类
    Ajax调用返回json数组,对象 (JSONArray.fromObject)
    (转)在JSP中调用JAVA类和使用JavaBean有什么区别?
    用log4j查看详细错误信息
  • 原文地址:https://www.cnblogs.com/haodafeng/p/11636767.html
Copyright © 2020-2023  润新知