C# 如何在WinForms PictureBox中从屏幕空间坐标转换为图像空间坐标?

C# 如何在WinForms PictureBox中从屏幕空间坐标转换为图像空间坐标?,c#,winforms,picturebox,C#,Winforms,Picturebox,我有一个在Windows窗体PictureBox控件中显示图像的应用程序。控件的SizeMode设置为Zoom,这样无论PictureBox的尺寸如何,包含在PictureBox中的图像都将以正确的方式显示 这对于应用程序的视觉外观非常好,因为您可以根据需要调整窗口的大小,并且图像将始终使用其最佳匹配来显示。不幸的是,我还需要处理图片框上的鼠标单击事件,并且需要能够从屏幕空间坐标转换为图像空间坐标 从屏幕空间到控制空间的转换似乎很容易,但我看不到任何明显的方法可以从控制空间转换到图像空间(即,在

我有一个在Windows窗体
PictureBox
控件中显示图像的应用程序。控件的
SizeMode
设置为
Zoom
,这样无论
PictureBox
的尺寸如何,包含在
PictureBox
中的图像都将以正确的方式显示

这对于应用程序的视觉外观非常好,因为您可以根据需要调整窗口的大小,并且图像将始终使用其最佳匹配来显示。不幸的是,我还需要处理图片框上的鼠标单击事件,并且需要能够从屏幕空间坐标转换为图像空间坐标

从屏幕空间到控制空间的转换似乎很容易,但我看不到任何明显的方法可以从控制空间转换到图像空间(即,在图片框中缩放的源图像中的像素坐标)


有没有一种简单的方法可以做到这一点,或者我应该复制他们在内部使用的缩放数学来定位图像并自己进行转换?

根据缩放,相对图像像素可以是许多像素中的任意位置。例如,如果图像被显著缩小,像素2,10可能代表2,10(一直到20,100),因此您必须自己进行计算,并对任何不准确之处承担全部责任!:-)

我只是手工实现了翻译。代码还不错,但它确实让我希望他们能直接为它提供支持。我认为这种方法在很多不同的情况下都是有用的

我想这就是他们添加扩展方法的原因:)

在伪代码中:

// Recompute the image scaling the zoom mode uses to fit the image on screen
imageScale ::= min(pictureBox.width / image.width, pictureBox.height / image.height)

scaledWidth  ::= image.width * imageScale
scaledHeight ::= image.height * imageScale

// Compute the offset of the image to center it in the picture box
imageX ::= (pictureBox.width - scaledWidth) / 2
imageY ::= (pictureBox.height - scaledHeight) / 2

// Test the coordinate in the picture box against the image bounds
if pos.x < imageX or imageX + scaledWidth < pos.x then return null
if pos.y < imageY or imageY + scaledHeight < pos.y then return null

// Compute the normalized (0..1) coordinates in image space
u ::= (pos.x - imageX) / imageScale
v ::= (pos.y - imageY) / imageScale
return (u, v)
//重新计算缩放模式用于适应屏幕上图像的图像缩放
imageScale::=min(pictureBox.width/image.width,pictureBox.height/image.height)
scaledWidth::=image.width*imageScale
scaledHeight::=image.height*imageScale
//计算图像的偏移量,使其在图片框中居中
imageX::=(pictureBox.width-scaledWidth)/2
imageY::=(pictureBox.height-缩放高度)/2
//根据图像边界测试图片框中的坐标
如果pos.x

要获得图像中的像素位置,只需乘以实际的图像像素尺寸,但标准化坐标允许您根据具体情况解决原始响应者关于解决歧义的观点。

您好,如果您手头还有代码示例,那么看到您编写的代码示例将非常棒。