6

アスペクト比を維持して画像のサイズを変更しようとしています。画面を空白なしで埋めるのに十分な大きさである必要があり、必要に応じて画像の一部を画面外に表示する必要があります。

下の画像は、黒い画面サイズに基づいて黄色の画像のサイズを設定する方法を示しています。

ここに画像の説明を入力してください

これが私が実際に使用しているコードですが、これを行うためのより良い方法はありますか?

if(bwidth > bheight) {
    if(bwidth > swidth && bheight > sheight) {
        new_height = sheight;
        new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100)));

    } else if(bwidth > swidth && bheight < sheight) {
        new_height = sheight;
        new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100)));

    } else if(bwidth < swidth && bheight < sheight) {
        new_height = sheight;
        new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100)));

    } else if(bwidth < swidth && bheight > sheight) {
        new_height = sheight;
        new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100)));

    } else if(bwidth >= swidth && bheight >= sheight) {
        new_width = swidth;
        new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100)));
    }

} else if(bwidth < bheight) {
    if(bwidth > swidth && bheight > sheight) {
        new_width = swidth;
        new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100)));

    } else if(bwidth < swidth && bheight > sheight) {        
        new_width = swidth;
        new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100)));

    } else if(bwidth < swidth && bheight < sheight) {
        new_width = swidth;
        new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100)));

    } else if(bwidth < swidth && bheight < sheight) {
        new_width = swidth;
        new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100)));

    } else if(bwidth >= swidth && bheight >= sheight) {
        new_width = swidth;
        new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100)));

    }
}
  • swidth=画面幅
  • sheight=画面の高さ
  • bwidth=画像の幅
  • bheight=画像の高さ
4

2 に答える 2

10

比率を比較します。

画像の幅と高さの比率が画面の幅と高さの比率よりも大きい場合は、画面の幅を使用して高さを計算していることがわかります。それ以外の場合は、画面の高さを使用して幅を計算します。高さがゼロになっていないことを確認してください。

ここのコードは、常に画面全体に表示されるように画像のサイズを変更することに注意してください。これにより、画像の追加部分が効果的に切り取られます。完全に表示された状態で画像をできるだけ大きくするには、最初の行の<をaに変更します。>

if (bwidth / bheight < swidth / sheight) {
    new_width = swidth;
    new_height = (int) Math.floor((double) bheight
                                  * (double) swidth / (double) bwidth);
} else {
    new_height = sheight;
    new_width = (int) Math.floor((double) bwidth
                                 * (double) sheight / (double) bheight);
}

また、さらにいくつかの改善を行いました。

  • 方程式を簡略化しました。分子と分母の両方を100で割っても、何も起こりません。
  • 型キャストを簡略化しました。各変数のタイプはわかりませんが、すべてdoubleである必要があります。
  • Math.floor型キャストの代わりに使用intして、切り上げられないようにします。
于 2013-01-07T14:27:50.327 に答える
-3

ありがとう@ErickRobertson少し変更しましたが、今は機能します!

変更されたコードは次のとおりです。

if (bwidth / swidth <  bheight / sheight) {
    new_width = swidth;
    new_height = (int) Math.floor((double) bheight 
                                  * (double) swidth / (double) bwidth);
} else {
    new_height = sheight;
    new_width = (int) Math.floor((double) bwidth 
                                 * (double) sheight / (double) bheight);
}
于 2013-01-07T14:43:10.433 に答える