我有一个应用程序在Windows窗体PictureBox
控件内显示图像。控件的SizeMode
设置为Zoom
,以便PictureBox
中包含的图片将以正确的方式显示,而不管PictureBox
的尺寸如何。
这对于应用程序的视觉外观非常有用,因为您可以根据需要调整窗口大小,并始终使用最适合的图像显示图像。不幸的是,我还需要在图片框上处理鼠标点击事件,并且需要能够从屏幕空间坐标转换为图像空间坐标。
看起来很容易从屏幕空间转换到控制空间,但我没有看到任何明显的方法从控制空间转换到图像空间(即源图像中已在图片中缩放的像素坐标框)。
有没有一种简单的方法可以做到这一点,或者我应该复制他们在内部使用的缩放数学来定位图像并自己进行翻译?
答案 0 :(得分:6)
我结束了手动实施翻译。代码不是太糟糕,但确实让我希望他们直接提供支持。我可以看到这种方法在很多不同的情况下都很有用。
我想这就是他们添加扩展方法的原因:))
在伪代码中:
// 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)
要获得图像中的像素位置,您只需乘以实际图像像素尺寸,但标准化坐标允许您根据具体情况解决原始响应者关于解决模糊性的观点。
答案 1 :(得分:1)
根据缩放比例,相对图像像素可以是多个像素中的任何位置。例如,如果图像按比例缩小,则像素2,10可以表示2到10,一直到20,100),因此您必须自己进行数学运算并对任何不准确性承担全部责任! : - )