基本上我要做的是使用鼠标事件旋转图片。例如,当您按住鼠标左键时,图片会在您上下移动鼠标时旋转。我发现这里的另一个问题几乎就像我的(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和其他所有人!
答案 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 ==原始图片
此代码对我有用