缩放图像以完全填充边界框

时间:2009-03-06 03:36:17

标签: algorithm image image-scaling

例如,如果我需要填充100px宽,50px高的边界框,以下输入图像将具有以下行为:

  1. 200w x 200h缩小50%和 25%被砍掉顶部和 底部。

  2. 200w x 100h缩小50% 没有裁剪。

  3. 100w x 200h gets不缩放,但是 75px从顶部和底部切断。

  4. 这似乎是一个常见的调整大小功能,但我无法追踪算法的一个例子。

    将接受包括伪代码在内的任何语言的答案。带答案的页面链接也很棒!

3 个答案:

答案 0 :(得分:12)

你要求的很简单。计算宽度和高度的不同比例因子,然后选择较大的比例因子作为实际比例因子。将您的输入大小乘以比例,然后裁剪出来的任何一个太大。

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

答案 1 :(得分:1)

这里我们确保只有在X大于100%时才进行缩放;然后在我们完成之后,我们确保我们的Y只有50 px。如果我们大于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;
}

答案 2 :(得分:0)

大部分受到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 };