单击带有大图像的 PictureBoxes
Clicking on PictureBoxes with Large Images
我有一个使用图片框的 winform 应用程序。在此,用户可以单击图片框并根据单击的位置执行某些操作。它适用于小图像。
作为参考,点击代码是这样的
private void picImage_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
int i, n;
if (!flagDown) return;
for (i = 0; i < numRect; i++)
{
//Here we compare e with some data to see if the
//click is inside somewhere
if (e.X > pp.ar[i].minX && e.X < pp.ar[i].maxX &&
e.Y > pp.ar[i].minY && e.Y < pp.ar[i].maxY)
{
n = i;
DoSomeProcess(n);
break;
}
}
flagDown = false;
}
我正在尝试修改它以便也可以处理大图像。
现在一个图片框有 SizeMode
属性 这可以是:
正常、StretchImage、AutoSize、CenterImage、缩放。
我试过使用 Normal 和 AutoSize。这些使得图片Box非常大,无法显示大图。另一方面,鼠标检查功能很好用。
另一方面,StretchImage 和 Zoom 使大图像显示为小图像,因此可以完整显示。然而,鼠标的值显然不能反映图像上的真实位置(它们被放大了)
我的问题是如何显示放大到小的大图像并使用自动应用的缩放值捕获鼠标位置?
我怎么知道这个缩放值?
编辑:
感谢 Ashkan Mobayen Khiabani 的回答!我接受了答案。
在我的代码中,我不得不颠倒缩放的计算顺序,因为 int zoom = picturebox.Image.Width/ picturebox.Width ;
否则它将为零(因为图像大于图片框)
那么你可以计算缩放系数:
int zoom = picturebox.Width / picturebox.Image.Width;
然后:
if(e.X* zoom > pp.ar[i].minX && e.X * zoom < pp.ar[i].maxX
&& e.Y*zoom > pp.ar[i].minY && e.Y*zoom < pp.ar[i].maxY)
如果您想在缩放图片框时获得最佳效果,您可以先计算缩放比例,然后相应地调整图片框的大小:
int zoom = 1;
if(picturebox.Image.Width>800|| picturebox.Image.Height>600)
zoom = Math.Min(800 /picturebox.Image.Width, 600 / picturebox.Image.Height); picturebox.Width = picturebox.Image.Width * zoom;
picturebox.Height= picturebox.Image.Height * zoom;
我有一个使用图片框的 winform 应用程序。在此,用户可以单击图片框并根据单击的位置执行某些操作。它适用于小图像。 作为参考,点击代码是这样的
private void picImage_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
int i, n;
if (!flagDown) return;
for (i = 0; i < numRect; i++)
{
//Here we compare e with some data to see if the
//click is inside somewhere
if (e.X > pp.ar[i].minX && e.X < pp.ar[i].maxX &&
e.Y > pp.ar[i].minY && e.Y < pp.ar[i].maxY)
{
n = i;
DoSomeProcess(n);
break;
}
}
flagDown = false;
}
我正在尝试修改它以便也可以处理大图像。
现在一个图片框有 SizeMode
属性 这可以是:
正常、StretchImage、AutoSize、CenterImage、缩放。
我试过使用 Normal 和 AutoSize。这些使得图片Box非常大,无法显示大图。另一方面,鼠标检查功能很好用。
另一方面,StretchImage 和 Zoom 使大图像显示为小图像,因此可以完整显示。然而,鼠标的值显然不能反映图像上的真实位置(它们被放大了)
我的问题是如何显示放大到小的大图像并使用自动应用的缩放值捕获鼠标位置? 我怎么知道这个缩放值?
编辑:
感谢 Ashkan Mobayen Khiabani 的回答!我接受了答案。
在我的代码中,我不得不颠倒缩放的计算顺序,因为 int zoom = picturebox.Image.Width/ picturebox.Width ;
否则它将为零(因为图像大于图片框)
那么你可以计算缩放系数:
int zoom = picturebox.Width / picturebox.Image.Width;
然后:
if(e.X* zoom > pp.ar[i].minX && e.X * zoom < pp.ar[i].maxX
&& e.Y*zoom > pp.ar[i].minY && e.Y*zoom < pp.ar[i].maxY)
如果您想在缩放图片框时获得最佳效果,您可以先计算缩放比例,然后相应地调整图片框的大小:
int zoom = 1;
if(picturebox.Image.Width>800|| picturebox.Image.Height>600)
zoom = Math.Min(800 /picturebox.Image.Width, 600 / picturebox.Image.Height); picturebox.Width = picturebox.Image.Width * zoom;
picturebox.Height= picturebox.Image.Height * zoom;