質問

たとえば、幅100ピクセル、高さ50ピクセルの境界ボックスを塗りつぶす必要がある場合、次の入力画像の動作は次のようになります。

  1. 200w x 200hは50%縮小され、 25%が上部から切り取られ、 下。

  2. 200w x 100hは50%縮小されます トリミングなし。

  3. 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;
}

Largely は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 };
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top