c# - 将矩形坐标转换为高分辨率图像
问题描述
我正在使用以下代码将小矩形坐标转换为更大的坐标,即:小图像上的矩形位置到同一图像的较大分辨率上的相同位置
Rectangle ConvertToLargeRect(Rectangle smallRect, Size largeImageSize, Size smallImageSize)
{
double xScale = (double)largeImageSize.Width / smallImageSize.Width;
double yScale = (double)largeImageSize.Height / smallImageSize.Height;
int x = (int)(smallRect.X * xScale + 0.5);
int y = (int)(smallRect.Y * yScale + 0.5);
int right = (int)(smallRect.Right * xScale + 0.5);
int bottom = (int)(smallRect.Bottom * yScale + 0.5);
return new Rectangle(x, y, right - x, bottom - y);
}
但是某些图像似乎存在问题。转换后的矩形坐标似乎与图像无关。
更新:
img.Draw(rect, new Bgr(232, 3, 3), 2);
Rectangle transret= ConvertToLargeRect(rect, orgbitmap.Size, bit.Size);
target = new Bitmap(transret.Width, transret.Height);
using (Graphics g = Graphics.FromImage(target))
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawImage(orgbitmap, new Rectangle(0, 0, target.Width, target.Height),
transret, GraphicsUnit.Pixel);
}
在小分辨率图像上绘制的矩形
{X=190,Y=2,Width=226,Height=286}
矩形转换为原始大分辨率图像{X=698,Y=7,Width=830,Height=931}
原始图像
解决方案
首先,如果您调整形状的大小,它不应该移动位置。这不是人们对扩大形状的期望。这意味着不应该转换左上角的 X、Y 点。
其次,您不应该将 0.5 手动添加到操作中,这不是一种干净的方式。按照@RezaAghaei 的建议使用天花板功能
第三,您不应该从高度/宽度中减去 X/Y,您的计算应该按照宽度 * 比例进行。
请纠正这些错误,如果它不起作用,我将通过额外的步骤更新答案。
推荐阅读
- python-3.x - 我在创建二维数组时遇到问题
- python-3.x - 从 CSV 下载照片列表
- php - Mpdf给出错误并且不输出pdf
- r - opts_knit$set(root.dir = ) 在 knit 中工作,但不是在块中工作
- vim - 如何在vim中检测光标前一行的缩进
- javascript - 计算每月总计
- javascript - 是否可以在 Promise 的状态未决时执行代码?
- flask - 烧瓶-jwt-扩展。当 JWT_COOKIE_CSRF_PROTECT=True 时 POST 请求失败
- python - Pytorch强化学习讲解
- ios - 从“AppDelegate”到“UNUserNotificationCenterDelegate”的条件转换总是成功(颤振)