2015-02-10 2 views
2

Мне нужна помощь по поиску позиции на изображении, которую пользователь дважды нажал.C# Положение курсора на матрице Преобразованное изображение

Я могу получить позицию на элементе управления из MouseEventArgs, но вам нужно преобразовать его в размеры изображения. Изображения были увеличены и изменены с использованием нового настраиваемого элемента управления.

масштабирование и панорамирование работа Любит Charm (на основании ZoomPicBox by Bob Powell) я получаю позицию, но это Total Off от того, где я нажимаю, кажется, будет отключен фактором, но я не могу понять, что это такое. двойной щелчок Код события, я пробовал сам (закомментирована перед матрицей), но имел тот же эффект, Vector2 Комментарий является справочным я нашел из Xna

protected override void OnMouseDoubleClick(MouseEventArgs e) 
    { 
     if (e != null) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       //_ImgDoubleClick.X = (int)(e.Location.X/this.Zoom) - this.AutoScrollPosition.X; 
       //_ImgDoubleClick.Y = (int)(e.Location.Y/this.Zoom) - this.AutoScrollPosition.Y; 

       using (Matrix mx = new Matrix(_zoom, 0, 0, _zoom, 0, 0)) 
       { 
        mx.Translate(this.AutoScrollPosition.X/_zoom, this.AutoScrollPosition.Y/_zoom); 

        //Vector2 worldPosition = Vector2.Transform(mousePosition, Matrix.Invert(viewMatrix)); 
        mx.Invert(); 
        Point worldPosition = VectorTransform(e.Location, mx); 

        _ImgDoubleClick.X = worldPosition.X; 
        _ImgDoubleClick.Y = worldPosition.Y; 
       } 
      } 

     }    


     base.OnMouseDoubleClick(e); 
    } 

    //------------------------------------- 
    private Point VectorTransform(Point vector, Matrix matrix) 
    { 
     //var tempX = (matrix.M11 * vector.X) + (matrix.M21 * vector.Y) + matrix.M31; 
     //var tempY = (matrix.M12 * vector.X) + (matrix.M22 * vector.Y) + matrix.M32; 

     int tempX = (int)((matrix.Elements[0] * vector.X) + (matrix.Elements[2] * vector.Y) + matrix.Elements[4]); 
     int tempY = (int)((matrix.Elements[1] * vector.X) + (matrix.Elements[3] * vector.Y) + matrix.Elements[5]); 

     return new Point(tempX, tempY); 
    } 

Ниже на краске Event

protected override void OnPaint(PaintEventArgs e) 
{ 
//if no image, don't bother 
if (_image == null) 
{ 
    base.OnPaintBackground(e); 
    return; 
} 
//Set up a zoom matrix 
using (Matrix mx = new Matrix(_zoom, 0, 0, _zoom, 0, 0)) 
{ 
    if (e != null) 
    { 
     //now translate the matrix into position for the scrollbars 
     mx.Translate(this.AutoScrollPosition.X/_zoom, this.AutoScrollPosition.Y/_zoom); 
     //use the transform 
     e.Graphics.Transform = mx; 
     //and the desired interpolation mode 
     e.Graphics.InterpolationMode = _interpolationMode; 
     //Draw the image ignoring the images resolution settings. 
     e.Graphics.DrawImage(_image, new Rectangle(0, 0, this._image.Width, this._image.Height), 0, 0, _image.Width, _image.Height, GraphicsUnit.Pixel); 
    } 
} 
//mx.Dispose(); 
base.OnPaint(e); 
} 

установки параметров коэффициент увеличения

public float Zoom 
    { 
     get 
     { 
      return _zoom; 
     } 
     set 
     { 
      if (value < 0 || value < 0.00001) 
       value = 0.00001f; 
      _zoom = value; 
      UpdateScaleFactor(); 
      Invalidate(); 
     } 
    } 

    //---------------------------------- 
    /// <summary> 
    /// Calculates the effective size of the image 
    ///after zooming and updates the AutoScrollSize accordingly 
    /// </summary> 
    private void UpdateScaleFactor() 
    { 
     if (_image == null) 
      this.AutoScrollMinSize = this.Size; 
     else 
     { 
      this.AutoScrollMinSize = new Size(
       (int)(this._image.Width * _zoom + 0.5f), 
       (int)(this._image.Height * _zoom + 0.5f) 
      ); 
     } 
    } 

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

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.ComponentModel; 

ответ

0

Не уверен в вашем коде. (Это немного слишком долго для меня, чтобы учиться прямо сейчас ..)

Но вот две функции я использую, чтобы позволить Point следовать Matrix преобразование или вернуться обратно:

static public PointF reLocation(PointF pt) 
    { 
     PointF[] eLocations = new PointF[] { pt }; 
     Matrix RM = ScaleMatrix.Clone(); 
     RM.Invert(); 
     RM.TransformPoints(eLocations); 
     return eLocations[0]; 
    } 

    static public PointF unreLocation(PointF pt) 
    { 
     PointF[] eLocations = new PointF[] { pt }; 
     Matrix RM = ScaleMatrix.Clone(); 
     RM.TransformPoints(eLocations); 
     return eLocations[0]; 
    } 

Примечание к слегка запутанным способом с массивами, необходимыми для использования TransformPoints!

+0

После тестирования кода я получаю те же результаты, что и мой код, оказалось, что я использовал ** баллы ** при попытке рисовать ** **. –

1

Кажется, я был прав все Allong моя ошибка была там, где я рисовал точку на изображении, рабочий код.

private void zoomPicBox1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     int x = zoomPicBox1.ImgDoubleClick.X; 
     int y = zoomPicBox1.ImgDoubleClick.Y; 
     using (Graphics grD = Graphics.FromImage(_bmp)) 
     //using (Graphics grD = Graphics.FromImage(zoomPicBox1.Image)) 
     { 
      grD.PageUnit = GraphicsUnit.Pixel; 
      grD.DrawEllipse(Pens.Black, x - 4, y - 4, 8, 8); 
      grD.DrawEllipse(Pens.Black, x - 3, y - 3, 6, 6); 
      grD.DrawEllipse(Pens.Black, x - 2, y - 2, 4, 4); 
      grD.DrawEllipse(Pens.Black, x - 1, y - 1, 2, 2); 
     } 
     this.zoomPicBox1.Invalidate(); 
    } 

моя проблема, я использую очки вместо Pixel

grD.PageUnit = GraphicsUnit.Point; 

, но я пытался рисовать на пиксель.

Смежные вопросы