如何从图片框中获取图像坐标(点),而不管平移和缩放

时间:2013-08-03 13:01:27

标签: c# image-processing graphics image-zoom

我已经成功获得了Picturebox上Mousedown位置的图像坐标,无论是Picturebox的各种尺寸模式。但是在平移操作或缩放操作后难以找到中心点。  至于现在我只在Picturebox的Normal Sizemode工作,以达到以下目的。

我的主要目标::

1。绘制以Mousedown位置为中心的圆圈

2。接下来找到在Picturebox(而不是在图像上)上绘制的圆的半径(以像素为单位),即使在平移和缩放之后也应该相同。即使在缩放或平移之后,如果我绘制一个圆(或椭圆),它应该给出我的图像半径。我知道点到像素的转换。


我已经使用Mousedown实现了平移,向上移动事件并使用轨迹栏实现了缩放。 我现在需要以下部分的帮助::  条件1: 我打开图像>>将其平移一定距离>>启用圆形工具>>用图像边界内的中心绘制它,然后绘制圆圈然后在那里 条件2: 我打开图像>>绘制圆圈,平移它,圆圈应该平移与图像平移相同的量。 这是我的MouseDown,MouseUp,MouseMove和Paint方法:

请告诉我你是否需要任何功能体或其他东西。因为它只是一个我正在处理的大杂乱的应用程序

告诉我你是否需要任何东西。打开符合我上面提到的主要目标的任何其他设计方法。

在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 个答案:

答案 0 :(得分:1)

如果我把你弄好了,这将绘制一个椭圆,其中心为mousedown捕获的点,而在鼠标移动事件中拖动鼠标以扩展或不扩展椭圆,它将在mousedown location捕获的点处居中。关于它将放在图片框中,在代码中(在mousemove事件中),我放置了两个变量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;
    }