我有一个图像(i)已从其原始大小(rectLarge)缩放以适合较小的矩形(rectSmall)。给定rectSmall中的点p,我该如何将其转换为rectLarge中的一个点。
为了使这个具体化,假设我有一个20x20的图像,它被缩放到10x10矩形。较小矩形中的点(1,1)应缩放到较大矩形中的一个点(即(2,2))。
我正试图通过以下方式实现这一目标:
result.x = point.x * (destRect.size.width / srcRect.size.width );
result.y = point.y * (destRect.size.height / srcRect.size.height);
但是,此代码生成的点不正确 - 它们不会映射到原始图像中的适当点。我做错了什么?
答案 0 :(得分:1)
您使用的是哪种语言?
如果这是C,并且rect.size.height
等是整数,那么你有一个重大的舍入问题。假设您将尺寸10, 10
从尺寸20x20
缩放到尺寸30x30
。您的计算结果如下:
result.x = 10 * (30 / 20);
这简化为:
result.x = 10 * (1);
解决这个问题的最简单方法是删除括号:
result.x = point.x * destRect.size.width / srcRect.size.width;
result.y = point.y * destRect.size.height / srcRect.size.height;
现在,您的计算10 * 30 / 20
简化为300 / 20
,然后简化为15
,这就是您想要的。
请注意,您仍然会遇到轻微的舍入问题,但除非您能够获得子像素位置,否则这个问题就像您将要获得的那样接近。
答案 1 :(得分:0)
什么是“适当的点”?如果srcRect
的大小大于destRect
,那么您的代码是正确的。此外,不要忘记result.x
和result.y
将是一个浮点数,并在图像中使用它们需要围绕它或进行双线性插值等。之前,我可以给出更多详细的答案,您将如何处理result
?
答案 2 :(得分:0)
我想问题是你的矩形不是(0, 0)
,因此,你不能像缩放它的尺寸一样缩放其中的每个点。
您必须确定矩形中某些定位点的偏移量(例如,左上角),然后结果点为anchor_point.x + offset.x * (horizontal_scale_ratio)
,y
为vertical_scale_ratio
(new_width / old_width
1}})。
比率有new_height / old_height
和{{1}}。