2013-08-03 3 views
1

У меня есть координаты изображения из мест Mousedown на Picturebox успешно, будь то различные режимы работы с Picturebox. Но сталкиваются с трудностями в поиске центральной точки после операции панорамирования или масштабирования. На данный момент я работаю только в Normal Sizemode из Picturebox, чтобы достичь следующего.Как получить координаты изображения (точек) из ящика изображения независимо от панорамирования и масштабирования

Моя главная цель ::

1. нарисовать круг с MouseDown место в центре

2. Далее найти радиус (в пикселях) от круг, нарисованный на Picturebox (не на изображении), который должен быть таким же всегда даже после панорамирования и масштабирования. Даже после масштабирования или панорамирования, если я нарисую круг (или эллипс), он должен дать мне радиус с точки зрения изображения. Я знаю преобразование точек в пиксели.


Я реализовал панорамирование с помощью MouseDown, вверх и переместить события и реализовано масштабирование с помощью TrackBar. Мне нужна помощь в следующих разделах: Условие 1: Открываю изображение >> Скопируйте его на определенное расстояние >> Включите инструмент «Круг» >> нарисуйте его с центром внутри границы изображения, а круг должен тогда и там Условие 2: Я открываю изображение >> Нарисуйте круг, поместите его, круг должен быть переведен на ту же сумму, что и изображение. Вот мои MouseDown, MouseUp, MouseMove и покраска методы:

Пожалуйста, скажите мне, если вам нужна функция тела или something.Because его просто большой грязный приложение, которое я работаю

Скажите мне, если вам что-нибудь нужно. Открой любой другой подход к дизайну, соответствующий моей главной цели, упомянутой выше.

EDIT после ответа TerryBozzio в ::

 Bitmap _bmp; 
     private bool _isMouseDown = false; 
     private Point _mouseDownLocation = Point.Empty; 
     int _xDifference, _yDifference; 
     public Form1() 
     { 
      InitializeComponent(); 
      _bmp = RenderImageOfSpecifiedSize(@"C:\Users\Public\Pictures\Sample Pictures\2 duck.bmp"); 
      _pictureBox.Image = _bmp; 
     } 

     private Bitmap RenderImageOfSpecifiedSize(string fileLocation) 
     { 
      //return new Bitmap(new Bitmap(fileLocation),new Size(300,300)); 
      return new Bitmap(fileLocation); 
     } 

     private void _pictureBox_MouseDown(object sender, MouseEventArgs e) 
     { 
      _isMouseDown = true; 
      _mouseDownLocation = new Point(e.X, e.Y); 
     } 
     private void _pictureBox_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (_isMouseDown) 
      { 
       _xDifference = _mouseDownLocation.X > e.X ? _mouseDownLocation.X - e.X : e.X - _mouseDownLocation.X; 
       _yDifference = _mouseDownLocation.Y > e.Y ? _mouseDownLocation.Y - e.Y : e.Y - _mouseDownLocation.Y; 
       _pictureBox.Invalidate(); 
      } 
     } 
     private void _pictureBox_MouseUp(object sender, MouseEventArgs e) 
     { 
      _isMouseDown = false; 
     } 
     private void _pictureBox_Paint(object sender, PaintEventArgs e) 
     { 
      _txtCenter.Text= _xDifference.ToString() + " - " + _yDifference.ToString(); 
      e.Graphics.DrawEllipse(Pens.Red, _mouseDownLocation.X - _xDifference, _mouseDownLocation.Y - _yDifference, _xDifference * 2, _yDifference * 2); 
     } 

ответ

1

Если я получил вам право это нарисовать эллипс с центром в точке, где поймали MouseDown, в то время как вы тащите мышь в случае перемещения мыши в разверните или не эллипс, он будет центрирован в точке, пойманной на месте усадьбы. О сиянии, которое будет в картинке, в коде (внутри события mousemove) я разместил 2 переменные Xdiff и Ydiff, чтобы выполнить работу, а также он показывает свои значения в типе формы (всегда обновляясь при перемещении), и их значения являются излучателями x и y, потому что обратите внимание на то, что вы может нарисовать овальный эллипс:

bool ismouseDown = false; 
    Point p; 
    int Xdiff, Ydiff; 
    Bitmap bmp; 

    public Form1() 
    { 
     InitializeComponent(); 
     bmp = (Bitmap)Image.FromFile(@"C:\..\YourImage.jpg"); 
     pictureBox1.Image = bmp; 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     this.Text = Xdiff.ToString() + " - " + Ydiff.ToString(); 

     e.Graphics.DrawEllipse(Pens.Black, p.X - Xdiff, p.Y - Ydiff, Xdiff * 2, Ydiff * 2); 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     ismouseDown = true; 
     p = e.Location; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (ismouseDown) 
     { 
      Xdiff = p.X > e.X ? p.X - e.X : e.X - p.X; 
      Ydiff = p.Y > e.Y ? p.Y - e.Y : e.Y - p.Y; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     ismouseDown = false; 
    } 
+0

@ terryBozio, Спасибо, что ответили. Я включил свой код в соответствии с вашим ответом в виде вышеизложенного. См. Функцию RenderImageOfSpecifiedSize (строка fileLocation). Укомплектовывайте линию внутри своего тела, и я получаю радиус разным, который должен быть таким же, независимо от размера изображения (будь то больше, чем картинка или меньше). Меня больше беспокоит место в муссонах, которое будет служить центром для круга. Как бы вы сохранили этот центр, не затронутый размером изображения. Моя другая цель - также отобразить радиус (без изменения панорамирования изображения). –

+0

вы можете просто сделать это: _pictureBox.Image = Изображение.FromFile (@ "C: \ Users \ Public \ Pictures \ Sample Pictures \ 2 duck.bmp"); ... остальная часть кода работает просто отлично, потому что графический объект рисует поверхность picbox, так что координаты остаются то же самое после изменения размера изображения, на всякий случай, когда я попытался установить кнопки для изменения sizemode picbox и остался тем же самым и лучезарным. – terrybozzio