请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

沙尘暴

初级会员

38

主题

111

帖子

319

积分

初级会员

积分
319
沙尘暴
初级会员   /  发表于:2016-4-4 16:34  /   查看:3896  /  回复:8
15金币
您好:
         求帮忙写个imageViewer1上画矩形的例子,是画,不是直接添加,虽然源码有(无法运行),而且本人新手较笨,求帮忙。谢谢了!

8 个回复

倒序浏览
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-4-5 16:53:33
沙发
Hello,你这个悬赏看的我激动啊。
但是我作为版主实在没法领这个钱。哈哈。

画矩形有两种方法:
一种是直接利用Graphic进行绘制图像,这个是C#里面的基本方法,如果需要可以百度C# 绘制矩形关键字。
一种是利用Annotation标注功能绘制矩形,这个是LEADTOOLS提供的功能。

以上两个都有示例代码可以参考,
绘制的示例:安装盘:\LEADTOOLS 19\Shortcuts\Image Processing\.NET Class Libraries\Draw
标注的示例:安装盘:\LEADTOOLS 19\Shortcuts\Annotation\.NET Class Libraries\Annotations
里面有源代码,你可以参考。
回复 使用道具 举报
沙尘暴
初级会员   /  发表于:2016-4-5 21:05:09
板凳
感谢版主回复  

我想用Graphic  DrawRectangle  在imageViewer1 上画矩形,但是不知道为什么不成功,但是以picturebox1上可以的,leadtools自带的draw没整明白,请版主大人,帮忙看下,或者写个简单的例子,万分感谢。


        private Point m_ptStart = new Point(0, 0);
        private Point m_ptEnd = new Point(0, 0);
        // true: MouseUp or false: MouseMove
        private bool m_bMouseDown = false;


    void ImageViewer1MouseDown(object sender, MouseEventArgs e)
        {

        if (e.Button != MouseButtons.Left)
           {
                return;
            }  
            if (!m_bMouseDown)
            {
                m_ptStart = new Point(e.X, e.Y);
                m_ptEnd = new Point(e.X, e.Y);
            }
            m_bMouseDown = !m_bMouseDown;
       
           }

            void ImageViewer1MouseMove(object sender, MouseEventArgs e)
        {
                       
           if (e.Button != MouseButtons.Left)
          {
                return;
            }
            
            m_ptEnd = new Point(e.X, e.Y);
            this.imageViewer1.Refresh();
               
          }



   void ImageViewer1MouseUp(object sender, MouseEventArgs e)
    {

         if (e.Button != MouseButtons.Left)
            {
                return;
            }
            if (m_ptStart.X >= 0 && m_ptEnd.X >= 0
                 && m_ptStart.Y >= 0 && m_ptEnd.Y >= 0
                 && m_ptStart.X <= 254 && m_ptEnd.X <= 254
                 && m_ptStart.Y <= 163 && m_ptEnd.Y <= 163)
            {
                m_ptEnd = new Point(e.X, e.Y);
                m_bMouseDown = !m_bMouseDown;
                this.imageViewer1.Refresh();
                //imageViewer1.Refresh
            }
            else
            {
                m_ptEnd = m_ptStart;
                m_bMouseDown = !m_bMouseDown;
                this.imageViewer1.Refresh();
            }
   

  void ImageViewer1Paint(object sender, PaintEventArgs e)
    {
               if (m_ptStart.Equals(m_ptEnd)) return;           
           
           //画矩形加上以下六行
          if  (m_ptEnd.X - m_ptStart.X < 0 || m_ptEnd.Y - m_ptStart.Y < 0)
           {
              return;
          }
          e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, m_ptStart.X, m_ptStart.Y, m_ptEnd.X - m_ptStart.X, m_ptEnd.Y - m_ptStart.Y);
        }
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-4-6 09:42:56
地板
沙尘暴 发表于 2016-4-5 21:05
感谢版主回复  

我想用Graphic  DrawRectangle  在imageViewer1 上画矩形,但是不知道为什么不成功,但 ...

绘制的没有问题。这个Draw最好写在MouseUp事件中。
另外,在ImageViewer上绘制请使用LEADTOOLS的RasterImageGdiPlusGraphicsContainer。示例如下:
using (RasterImageGdiPlusGraphicsContainer container = new RasterImageGdiPlusGraphicsContainer(_viewer.Image))
                     {
                        // we are going to use a graphics path to correctly align the rectangle/ellipse edge with the interior
                        using(GraphicsPath path = new GraphicsPath())
                        {
                           if(_action == ActionType.Rectangle)
                              path.AddRectangle(_trackingRectangle);
                           else
                              path.AddEllipse(_trackingRectangle);

                           // fill this path
                           if(_brushUse)
                           {
                              using(Brush brush = new SolidBrush(_brushColor))
                                 container.Graphics.FillPath(brush, path);
                           }

                           // stroke the path
                           using(Pen pen = new Pen(_penColor, _penWidth))
                           {
                              // use anti-alias lines
                              container.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                              container.Graphics.DrawPath(pen, path);
                           }
                        }
                     }
                     _viewer.Invalidate();

这个示例代码在:安装盘:\LEADTOOLS 19\Shortcuts\Image Processing\.NET Class Libraries\Draw
回复 使用道具 举报
沙尘暴
初级会员   /  发表于:2016-4-10 13:10:36
5#
AvoCaDolol 发表于 2016-4-6 09:42
绘制的没有问题。这个Draw最好写在MouseUp事件中。
另外,在ImageViewer上绘制请使用LEADTOOLS的RasterI ...

不好意思 回复晚了,这个问题已经解决了,但是由此引发另一个问题,请版主帮忙解决下, 由   path.AddRectangle(_trackingRectangle);  或者    container.Graphics.DrawRectangle(pen, _trackingRectangle);   这两个画出的矩形,不知怎么清除呢,就是每画一次新的矩形,同时将上次画的矩形清除。注:背景imageViewer1.Image中的图片不固定。  版主帮忙.
回复 使用道具 举报
沙尘暴
初级会员   /  发表于:2016-4-10 13:10:44
6#
AvoCaDolol 发表于 2016-4-6 09:42
绘制的没有问题。这个Draw最好写在MouseUp事件中。
另外,在ImageViewer上绘制请使用LEADTOOLS的RasterI ...

不好意思 回复晚了,这个问题已经解决了,但是由此引发另一个问题,请版主帮忙解决下, 由   path.AddRectangle(_trackingRectangle);  或者    container.Graphics.DrawRectangle(pen, _trackingRectangle);   这两个画出的矩形,不知怎么清除呢,就是每画一次新的矩形,同时将上次画的矩形清除。注:背景imageViewer1.Image中的图片不固定。  版主帮忙.
回复 使用道具 举报
沙尘暴
初级会员   /  发表于:2016-4-10 13:10:56
7#
AvoCaDolol 发表于 2016-4-6 09:42
绘制的没有问题。这个Draw最好写在MouseUp事件中。
另外,在ImageViewer上绘制请使用LEADTOOLS的RasterI ...

不好意思 回复晚了,这个问题已经解决了,但是由此引发另一个问题,请版主帮忙解决下, 由   path.AddRectangle(_trackingRectangle);  或者    container.Graphics.DrawRectangle(pen, _trackingRectangle);   这两个画出的矩形,不知怎么清除呢,就是每画一次新的矩形,同时将上次画的矩形清除。注:背景imageViewer1.Image中的图片不固定。  版主帮忙.
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-4-11 16:42:58
8#
沙尘暴 发表于 2016-4-10 13:10
不好意思 回复晚了,这个问题已经解决了,但是由此引发另一个问题,请版主帮忙解决下, 由   path.AddRec ...

您好, 通过Graphic绘制的图形是无法清除的。
我举个例子,这就像用油笔在白纸上画了一个形状,是无法清除的。而ImageViewer就是白纸。

想要清除,可以通过缓存的形式来做,意思就是,每次开始绘制之前,将当前图片保存下来,作为原始图片,下次在开始绘制前调用以达到清除的目的。
这个有点像撤销操作,是的,撤销操作就是这样实现的。
你可以新建一个List<RasterImage>数组来缓存图片,模仿栈的方式,先进先出,后进后出。
至于为什么Graphic擦不掉,你可以百度一下关键字:C# 绘制 擦除。
回复 使用道具 举报
沙尘暴
初级会员   /  发表于:2016-4-13 20:18:39
9#
感谢版主的支持,问题已解决。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部