我正在创建一个应用程序,用户可以上传图像并在特定位置(当前鼠标指针)缩放图像。
同时,当图像被缩放时,用户应该能够拖动图像以查看其它部分。
我实现了一些功能来实现它,但是我正在对整个图像进行缩放。我想知道如何缩放图像的特定部分,或者缩放整个图像然后指向当前鼠标指针所在的位置。
代码:
我尝试从MouseHover事件中获取当前鼠标位置,并且在进行缩放时尝试翻译图片,但是这并不起作用。
此外,PictureBox内还有其他多个PictureBox,用于显示大图像上的某些表示。在缩放大图像时,小图像(内部图像)不应缩放。虽然它们的位置需要重新计算,以便在对大图像进行缩放后仍能在其实际位置上显示它们。
因此,我面临两个问题:
1)通过滚动来在任何特定位置(当前鼠标指针)缩放图像。
2)在缩放和平移时重新生成子图像的坐标。
请帮助我找到正确的方向。
如果通过其他方式,我也可以实现此功能。
应用程序:Windows
控件:PictureBox(如果不能使用,请建议其他控件)
语言:C#
等待您的回复!
同时,当图像被缩放时,用户应该能够拖动图像以查看其它部分。
我实现了一些功能来实现它,但是我正在对整个图像进行缩放。我想知道如何缩放图像的特定部分,或者缩放整个图像然后指向当前鼠标指针所在的位置。
代码:
private void DisplayIsdDiagram(BO.IsdDiagram IsdDiagram)
{
DoubleBuffered = true;
zoomFac = 1;
translateX = 0;
translateY = 0;
transStartX = 0f;
transStartY = 0f;
picIsdDiagram.BorderStyle = BorderStyle.Fixed3D;
bmp = new Bitmap(Image.FromStream(new MemoryStream(IsdDiagram.Image.ToArray())));
if (bmp.Width > bmp.Height)
{
ratio = (float)picIsdDiagram.Width / (float)bmp.Width;
translateRatio = (float)bmp.Width / (float)picIsdDiagram.Width;
}
else
{
ratio = (float)picIsdDiagram.Height / (float)bmp.Height;
translateRatio = (float)bmp.Height / (float)picIsdDiagram.Height;
}
//picIsdDiagram.Image = bmp;
picIsdDiagram.Refresh();
picIsdDiagram.MouseWheel += new MouseEventHandler(picIsdDiagram_MouseWheel);
}
private void picIsdDiagram_MouseWheel(object sender, MouseEventArgs e)
{
IsZooming = true;
if (e.Delta < 0)
{
if (zoomFac > 1)
zoomFac = zoomFac - (float)0.1;
}
else
{
if (zoomFac <= 5)
zoomFac = zoomFac + (float)0.1;
}
picIsdDiagram.Refresh();
IsZooming = false;
}
private void picIsdDiagram_MouseDown(object sender, MouseEventArgs e)
{
IsZooming = false;
IsMouseDown = true;
transStartX = e.X;
transStartY = e.Y;
}
private void picIsdDiagram_MouseUp(object sender, MouseEventArgs e)
{
IsZooming = false;
IsMouseDown = false;
translateX = translateX + ((e.X - transStartX) * (translateRatio / zoomFac));
translateY = translateY + ((e.Y - transStartY) * (translateRatio / zoomFac));
picIsdDiagram.Refresh();
}
private void picIsdDiagram_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.ScaleTransform(ratio * zoomFac, ratio * zoomFac);
if (IsZooming == false && IsMouseDown == true)
g.TranslateTransform(translateX, translateY);
g.DrawImage(bmp, 0, 0);
}
我尝试从MouseHover事件中获取当前鼠标位置,并且在进行缩放时尝试翻译图片,但是这并不起作用。
此外,PictureBox内还有其他多个PictureBox,用于显示大图像上的某些表示。在缩放大图像时,小图像(内部图像)不应缩放。虽然它们的位置需要重新计算,以便在对大图像进行缩放后仍能在其实际位置上显示它们。
因此,我面临两个问题:
1)通过滚动来在任何特定位置(当前鼠标指针)缩放图像。
2)在缩放和平移时重新生成子图像的坐标。
请帮助我找到正确的方向。
如果通过其他方式,我也可以实现此功能。
应用程序:Windows
控件:PictureBox(如果不能使用,请建议其他控件)
语言:C#
等待您的回复!