例如,如果我需要填充 100px 宽 x 50px 高的边界框,以下输入图像将具有以下行为:
200w x 200h 缩小了 50%,顶部和底部减少了 25%。
200w x 100h 在没有裁剪的情况下缩小了 50%。
100w x 200h 没有缩放,但 75px 被切掉顶部和底部。
这似乎是一个常见的调整大小功能,但我无法找到该算法的示例。
将接受任何语言的答案,包括伪代码。带有答案的页面的链接也很棒!
例如,如果我需要填充 100px 宽 x 50px 高的边界框,以下输入图像将具有以下行为:
200w x 200h 缩小了 50%,顶部和底部减少了 25%。
200w x 100h 在没有裁剪的情况下缩小了 50%。
100w x 200h 没有缩放,但 75px 被切掉顶部和底部。
这似乎是一个常见的调整大小功能,但我无法找到该算法的示例。
将接受任何语言的答案,包括伪代码。带有答案的页面的链接也很棒!
你要的很简单。计算宽度和高度的不同比例因子,然后为您的实际比例因子选择较大的比例因子。将您的输入大小乘以比例,然后裁剪任何一个太大。
scale = max(maxwidth/oldwidth, maxheight/oldheight)
scaledwidth = oldwidth * scale
scaledheight = oldheight * scale
if scaledheight > maxheight:
croptop = (scaledheight - maxheight) / 2
cropbottom = (scaledheight - maxheight) - croptop
if scaledwidth > maxwidth:
cropleft = (scaledwidth - maxwidth) / 2
cropright = (scaledwidth - maxwidth) - cropleft
在这里,我们确保仅在 X 大于 100% 时进行缩放;然后在我们完成之后,我们确保我们在 Y 上只有 50 像素。如果我们大于 50,那么我们将差值除以 2 以获得从顶部/底部移除的数量。
double percent_x = 1.0;
if(X > 100) {
percent_x = (float)100/X;
X *= percent_x;
Y *= percent_x;
}
int diff_y;
int top_cut, bott_cut;
if( Y > 50 ) {
diff_y = (Y - 50) / 2;
top_cut = bott_cut = diff_y;
}
很大程度上受到 Mark Ransom 的回答的启发(非常感谢 - 你救了我)。对于任何想要在不裁剪图像的情况下执行此操作的人(刚好适合范围内),我发现这可行:
if (maxWidth > width && maxHeight > height) {
return { width, height };
}
aspectRatio = width / height,
scale = max(maxWidth / width, maxHeight / height);
scaledHeight = height * scale,
scaledWidth = width * scale;
if (scaledHeight > maxHeight) {
scaledHeight = maxHeight;
scaledWidth = aspectRatio * scaledHeight;
} else if (scaledWidth > maxWidth) {
scaledWidth = maxWidth;
scaledHeight = scaledWidth / aspectRatio;
}
return { scaledHeight, scaledWidth };