8

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

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

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

  3. 100w x 200h の取得はスケーリングされませんが、75px は上下から切り取られます。

これは一般的なサイズ変更機能のようですが、アルゴリズムの例を突き止めることができませんでした。

疑似コードを含む任意の言語での回答を受け入れます。答えのあるページへのリンクも素晴らしいです!

4

3 に答える 3

13

あなたが求めるものはとても簡単です。幅と高さのさまざまな倍率を計算し、実際の倍率として大きい方を選択します。入力サイズにスケールを掛けて、大きすぎる方をトリミングします。

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
于 2009-03-06T03:41:11.673 に答える
1

ここでは、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;
}
于 2009-03-06T03:45:19.400 に答える