在C#中使用鼠标位置旋转图片

时间:2010-02-28 00:18:53

标签: c# rotation image image-rotation mouse-coordinates

基本上我要做的是使用鼠标事件旋转图片。例如,当您按住鼠标左键时,图片会在您上下移动鼠标时旋转。我发现这里的另一个问题几乎就像我的(How do I rotate a picture in C#)但是当将旋转方法中的角度参数(链接中的方法源代码)映射到鼠标和图像中心之间的计算角度时,我得到一个溢出异常抛出。我正在尝试旋转的图像位于图片框中。有任何想法吗?我应该这样做吗?

提前致谢!

---------编辑1 -----------

好的我认为我的触发器已关闭,我将其改为......

Angle = Atan((mousePosY - imageCenterY)/(mousePosX - imageCenterX)

但是现在图像不会旋转,它只是移动(我编程了它移动的能力,但工作正常)。这是我正在处理的代码片段。

    private void pictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;

        pbCurrentX = e.X;
        pbCurrentY = e.Y;

    }

    private void pictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        // For moving the image
        if (isDragging)
        {
            this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
            this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
        }

        // For rotating the image
        if (rotateMode  && isDragging)
        {
            y2 = e.Y;
            y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
            x2 = e.X;
            x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));

            angle = (float)Math.Atan((y2-y1)/(x2-x1));

            // RotateImage method from the other question linked above
            this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
        }


    }

双击pictureBox时,rotateMode标志设置为true。谢谢大家!

--------- ANSWER -----------

感谢Gabe,我在代码中发现了所有小问题,现在工作正常。唯一的问题是我必须使图片框的大小更大以适应旋转的图像。以下是每个想要了解答案的人的正确代码。

private void pictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;

        pbCurrentX = e.X;
        pbCurrentY = e.Y;

    }

    private void pictureBox_MouseMove(object sender, MouseEventArgs e)
    {

        if (isDragging && !rotateMode)
        {
            this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
            this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
        }

        if (rotateMode  && isDragging)
        {
            y2 = e.Y;
            y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
            x2 = e.X;
            x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));

            angle = (float)Math.Atan2((y1 - y2), (x1 - x2));

            pictureBox1.Image =  RotateImage(currentImage, (100*angle));
        } 

    }

    private void pictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        isDragging = false;
    }

感谢Gabe和其他所有人!

4 个答案:

答案 0 :(得分:1)

如果没有看到您的代码,我们只能猜测。 我的猜测是你正在做某种三角计算,例如:

theta = Math.Atan((y2 - y1) / (x2 - x1));

如果你的x2-x1变为0,那么你对Math.Atan的论证会走向无穷大,并且会溢出。

答案 1 :(得分:1)

您是否尝试过this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);的问题?您链接的RotateImage函数返回了一个新的旋转图像,而不是像代码所期望的那样就地旋转它。

不幸的是,这样做会旋转已旋转的图像。您需要做的是将原始图像存储在某处,例如originalImage。然后有this.pictureBox1.Image = RotateImage(originalImage, angle);。这样它总是旋转原版的新版本。

答案 2 :(得分:0)

  

Angle = Atan((mousePosY - imageCenterY)/(mousePosX - imageCenterY)

你在那里使用imageCenterY两次,(虽然它在你发布的代码中没问题。)

无论如何,我建议使用Atan2而不是Atan。

答案 3 :(得分:0)

     int  y2 = _cursory; // Cursor.Postion.Y

     int   y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
     int x2 = _cursorx; // Cursor.Postion.X
     int   x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));

      float  angle = (float)Math.Atan2((y1 - y2), (x1 - x2));
      float xDistance = x1 - this.pictureBox1.Location.X;
      float yDistance = y1 - this.pictureBox1.Location.Y;

      double deg = angle / Math.PI * 180 + 180;
      pictureBox1.Image = RotateImage(img, (int)deg);

// img ==原始图片

  

此代码对我有用