Рисование прямоугольника на картинке - как ограничить площадь прямоугольника? - PullRequest
5 голосов
/ 24 августа 2011

Я рисую прямоугольник на картинке с событиями мыши:

private void StreamingWindow_MouseDown(object sender, MouseEventArgs e)
    {
              rect = new Rectangle(e.X, e.Y, 0, 0);
              this.Invalidate();       
    }

    private void StreamingWindow_Paint(object sender, PaintEventArgs e)
    {

       if (painting == true)
        {

            using (Pen pen = new Pen(Color.Red, 2))
            {
                e.Graphics.DrawRectangle(pen, rect);
            }
        }
    }

    private void StreamingWindow_MouseMove(object sender, MouseEventArgs e)
    {       
           if (e.Button == MouseButtons.Left)
           {
               // Draws the rectangle as the mouse moves
               rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);
           }
           this.Invalidate();     
    }

После рисования прямоугольника я могу захватить его внутри и сохранить как jpg.

В чем моя проблема?

Я могу нарисовать прямоугольник, границы которого находятся за пределами области рисунка:

enter image description here

Как я могу ограничить площадь прямоугольника тем, что граница области изображения является максимально допустимым местоположением прямоугольника?

Извините за мой английский, надеюсь, вы поймете мою проблему :) В результате я хотел бы получить что-то вроде этого:

enter image description here

Ответы [ 4 ]

2 голосов
/ 25 августа 2011
private void StreamingWindow_MouseMove(object sender, MouseEventArgs e)
{       
  if (e.Button == MouseButtons.Left)
  {
    // Draws the rectangle as the mouse moves
    rect = new Rectangle(rect.Left, rect.Top, Math.Min(e.X - rect.Left, pictureBox1.ClientRectangle.Width - rect.Left), Math.Min(e.Y - rect.Top, pictureBox1.ClientRectangle.Height - rect.Top));
  }
  this.Invalidate();     
}
0 голосов
/ 07 апреля 2013

Другим способом решения этой проблемы является предотвращение утопления прямоугольника вне элемента управления pictureBox

private void StreamingWindow_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (e.X < StreamingWindow.Width && Math.Abs(e.Y) < StreamingWindow.Height)
                // Draws the rectangle as the mouse moves
                rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y -rect.Top);
        }
        this.Invalidate();
    }

Кто-нибудь может найти это решение более полезным

0 голосов
/ 24 августа 2011

Почему бы не установить прямоугольные координаты на что-то

 rect = new Rectangle(min(e.X, pictureBoxX), min(e.Y, pictureBoxY), 0, 0);

Вам необходимо рассчитать pictureX и pictureY в соответствии с расположением и положением графического блока.

0 голосов
/ 24 августа 2011

Я бы сказал, что самый простой способ добиться этого, и лично я считаю, что более естественным с точки зрения UX является: после MouseUp проверить, находится ли BottomLeft угол прямоугольника за пределами области графического блока, если так просто верните его "назад" и выровняйте его по углу окна изображения, как вы нарисовали .

EDIT

Просто чтобы дать вам представление о чем я говорю, псевдокод

    private void StreamingWindow_MouseUp(object sender, MouseEventArgs e)
    {
              if(rect.Right > myPictureBox.ClientRectangle.Right)
              {
                 rect.Width = myPictureBox.Right - rect.Left - someoffset;                     
              }       
              if(rect.Bottom > myPictureBox.ClientRectangle.Bottom)
              {
                 rect.Height= myPictureBox.Bottom - rect.Top - someoffset;                     
              }       
    }

Примерно так. Но вы должны проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...