单击具有大图像的PictureBox

时间:2018-08-06 08:19:21

标签: c# mouseevent zoom picturebox

我有一个使用图片框的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,自动调整大小,CenterImage,缩放。

我尝试使用Normal和AutoSize。这些使图片框非常大,无法显示大图像。另一方面,鼠标检查功能效果很好。

另一方面,StretchImage和Zoom可以使大图像显示为小图像,从而完全显示出来。但是,鼠标的值显然不能反映图像的真实位置(它们已经缩放)

我的问题是如何显示放大到较小的大图像,并同时使用自动应用的缩放值捕获鼠标位置? 我怎么知道这个变焦值?

编辑: 感谢Ashkan Mobayen Khiabani的回答!我接受了答案。 在我的代码中,我必须将缩放的计算顺序反转为int zoom = picturebox.Image.Width/ picturebox.Width ;,否则它将为零(因为Image大于图片框)

1 个答案:

答案 0 :(得分:1)

您可以计算缩放系数:

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;