2

ここでの問題は、サイズx x yの表示ウィンドウがあり、スクロールせずにウィンドウ内に画像を表示し、アスペクト比を4:3に維持する必要があることです。次のコードスニペットがあります。

// Lock the current height, calculate new width of the canvas and scale the viewport.
// get width of the movie canvas
qreal width = canvas_->width();

// Find the height of the video
qreal height = (width/4.0) * 3;

// find original width and height for video to calculate scaling factor
qreal videoWidth = movieData_->GetWidth();
qreal videoHeight = movieData_->GetHeight();

// calculate scaling factor
qreal scaleFactorWidth = width/videoWidth;
qreal scaleFactorHeight = height/videoHeight;

もちろん、高さまたは幅のいずれかを「アンカー」として使用すると、いずれかの方法で新しい画像がスクロールします(元の画像が最初にウィンドウよりも大きいと仮定します)。所定のサイズに収まるアスペクト比4:3の寸法を見つけるにはどうすればよいですか?

編集 スケーリングを行うには、xとyの両方のスケール係数を渡す必要があります

canvas_->scale(scaleFactorWidth, scaleFactorHeight);
4

4 に答える 4

5

計算された両方の値の最小値を取るだけです。

scale = min(scaleFactorWidth, scaleFactorHeight)

または(アウターフィットが必要な場合)

scale = max(scaleFactorWidth, scaleFactorHeight)
于 2009-09-02T09:52:17.767 に答える
2
    struct dimensions resize_to_fit_in(struct dimensions a, struct dimensions b) {
        double wf, hf, f;
        struct dimensions out;

        wf = (double) b.w / a.w;
        hf = (double) b.h / a.h;

        if (wf > hf)
                f = hf;
        else
                f = wf;

        out.w = a.w * f;
        out.h = a.h * f;

        return out;
}

これがCバージョンで、返される寸法は、アスペクト比を失うことなく、寸法「b」にフィットする寸法「a」になります。

于 2009-09-02T10:14:57.127 に答える
1

widthwと heightの 2 つの値のうち最大のものを見つけますh。幅の最大x高さが 100 x80 だとします。100/80 = 1.25 であることに注意してください。

ケース 1: の場合w/h > 1.25、100 で割りw、元のサイズと新しいサイズの比率を取得します。h次に、その比率を掛けます。

ケース 2: それ以外の場合は、h80 で割り、元のサイズと新しいサイズの比率を取得します。w次に、その比率を掛けます。

于 2009-09-02T09:55:07.917 に答える
1

これは、あなたが求めるもののActionScriptバージョンです(アスペクト比を維持しながらサイズ変更します)...何にでも移植するのはそれほど難しくありません:

    private static function resizeTo(dispObj:DisplayObject, width:Number, height:Number) : void
    {
        var ar:Number = width / height;
        var dispObjAr:Number = dispObj.width/dispObj.height;
        if (ar < dispObjAr)
        {
            dispObj.width = width;
            dispObj.height = width / dispObjAr;
        }
        else
        {
            dispObj.height = height;
            dispObj.width = height * dispObjAr;
        }
        return;
    }

編集: 4:3 を維持するには、ソース画像を 4:3 にする必要があります

于 2009-09-02T10:01:55.517 に答える