把触屏或鼠标坐标点,映射到不同分辨率的相对位置

该文讨论了如何将一个坐标点从一个分辨率映射到另一个分辨率,保持比例一致。通过计算宽高缩放尺度,得出坐标转换公式,当分辨率改变时,映射后的坐标可能为非整数,需进行取整处理。提供的代码示例展示了如何实现这一转换过程,特别是在从低分辨率到高分辨率的场景中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景

把已知的一个坐标点,映射到不同分辨率的相对位置,当然比例需要必须一致一般情况下,屏幕目前都是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);
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值