不同图像尺寸下坐标重计算方法及错误坐标转换逻辑修复问询
坐标转换原理说明
原来的错误坐标转换代码执行了两步操作:
- 坐标裁剪平移:以
source.LeftExtent、source.TopExtent为新的左上角原点,将原始坐标平移到裁剪后的局部坐标系 - 比例缩放:将裁剪区域的坐标按比例缩放到目标尺寸
iWidth * iHeight的坐标系
对应的正向转换公式:错误坐标X = (原始坐标X - 左裁剪偏移) * (目标宽度 / 裁剪区域宽度)错误坐标Y = (原始坐标Y - 上裁剪偏移) * (目标高度 / 裁剪区域高度)
逆向还原公式
要从错误坐标还原出适配原始图像的正确坐标,把正向操作反向执行即可:
- 反向缩放:将错误坐标除以缩放比例,还原到裁剪区域的局部坐标系
- 反向平移:加回裁剪偏移量,还原到原始图像的全局坐标系
对应的还原公式:原始坐标X = (错误坐标X / 缩放比例X) + 左裁剪偏移原始坐标Y = (错误坐标Y / 缩放比例Y) + 上裁剪偏移
其中缩放比例X = 错误转换时的目标宽度iWidth / 裁剪区域宽度,缩放比例Y = 错误转换时的目标高度iHeight / 裁剪区域高度
修复代码修正
你当前代码的比例计算逻辑写反了,同时逆向操作不需要减去偏移量,而是要加回偏移量,修正后的核心逻辑如下:
private string CalcNewPoints(Image image, Mapping mapping, MappingDimension source) { var coordBuilder = new StringBuilder(); var coords = mapping.CoOrdinates.Split(' '); // 比例为原始图像尺寸除以错误转换后的裁剪区域尺寸,和正向缩放比例互为倒数 double xRatio = image.Width / source.Width; double yRatio = image.Height / source.Height; foreach(string pair in coords) { if(pair.Contains(',')) { string[] coord = pair.Split(','); double xPos = 0f; double yPos = 0f; double.TryParse(coord[0], out xPos); double.TryParse(coord[1], out yPos); // 逆向逻辑:先反向缩放,再加回裁剪偏移 double newX = xPos * xRatio + source.Left; double newY = yPos * yRatio + source.Top; coordBuilder.Append($"{newX:F2},{newY:F2} "); } } return coordBuilder.ToString().Trim(); }
补充说明
- 如果原始的
source.LeftExtent/TopExtent等裁剪参数有留存,优先用原始参数计算,比你从现有标注里统计得到的mappingDims精度更高 - 坐标精度建议保留2位小数即可,避免不必要的字符串长度冗余
- 如果图像本身也同步做了缩放裁剪,需要先把图像还原到原始尺寸,才能保证坐标和图像位置匹配
内容的提问来源于stack exchange,提问作者onesixtyfourth
相关产品推荐
相关产品推荐

