1

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

我的主要目标::

1.以Mousedown位置为中心画一个圆

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


我已经使用 Mousedown、up 和 move 事件实现了平移,并使用 trackbar 实现了缩放。我现在需要以下部分的帮助::条件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);
        }
4

1 回答 1

1

如果我猜对了,这将绘制一个椭圆,中心为 mousedown 捕获的点,当您在鼠标移动事件中拖动鼠标以展开或不展开椭圆时,它将以 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;
    }
于 2013-08-03T16:58:49.550 回答