问题背景
把已知的一个坐标点,映射到不同分辨率的相对位置,当然比例需要必须一致一般情况下,屏幕目前都是16:9
如图所示(以下段落,来至[稀土掘金]超链接)
从分辨率 W0 x H0 ,变化到分辨率 W1 x H1 ,宽高上的缩放尺度为:
W_scale = W1/W0 = x1/x0
H_scale = H1/H0 = y1/y0
所以,缩放前后,对应像素的坐标基本映射关系为:
x0 = x1 * (W0 / W1)
y0 = y1 * (H0 / H1)
也即,目标图像的点 P1 ( x1 , y1 ),在原始图像上的映射为 P0 ( x1 * (W0 / W1),y1 * (H0 / H1) )。
显然,在分辨率不变的理想情况下,W0 / W1 = H0 / H1 = 1,P1 ( x1 , y1 ) 在原始图像上的映射为 P0 ( x1 ,y1 ),符合我们的推演。而在分辨率变动的情况下, P0 ( x1 * (W0 / W1),y1 * (H0 / H1) ) 可能会得到非整数的坐标,非整数坐标的像素在原图上是不存在的。
举个例子:原始图像分辨率 W0 x H0 = 100 x 100,目标图像分辨率 W1 x H1 = 1000 x 1000,此时目标图像 P1 ( x1 , y1 ) 在原始图像上的映射为 P0 ( x1 * 0.1 ,y1 * 0.1)
结合以上总结,代码描述如下:
/// <summary>
/// 屏幕坐标点转换 Lv
/// (描述:在1280*720上触摸了一个点把这个点映射到1920的分辨率上)
/// </summary>
/// <param name="points">系统触摸点</param>
/// <param name="source">源分辨</param>
/// <param name="tag">目标分辨率</param>
public static void ConversionPoint(System.Drawing.Point[] points, System.Windows.Size tag, System.Windows.Size source)
{
for (int i = 0; i < points.Length; i++)
{
double x = (double)tag.Width / source.Width;
double y = (double)tag.Height / source.Height;
points[i].X = Convert.ToInt32(x * points[i].X);
points[i].Y = Convert.ToInt32(y * points[i].Y);
}
}