1

私は数学が本当に苦手で、画像のサイズ変更アルゴリズムに問題があります。画像のサイズを特定の比率に変更しようとしています。

double neededRatio = 1.6d;
while (!AboutEqual(imageRatio, neededRatio))
{
    var cropPixels = 10;
    //crop code
    ...
    imageRatio = (double)img.Width / img.Height;
}

public static bool AboutEqual(double x, double y)
{
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}

問題は、メソッドを実際に機能させるためにトリミングする適切なピクセル数が見つからないように見えることです(ここでAboutEqual見つけました)。失敗して画像が無期限にトリミングされることがあります。メソッドの内部動作をログに記録しようとしましたが、次のように奇妙なことが表示されています。AboutEqual

X: 1.5249500998004  Y: 1.6 result: false
X: 1.55600814663951 Y: 1.6 result: false
X: 1.55600814663951 Y: 1.6 result: false
X: 1.58835758835759 Y: 1.6 result: false
X: 1.62208067940552 Y: 1.6 result: false
X: 1.60084925690021 Y: 1.6 result: false
X: 1.5796178343949  Y: 1.6 result: false
X: 1.61388286334056 Y: 1.6 result: false
X: 1.59219088937093 Y: 1.6 result: false
X: 1.62749445676275 Y: 1.6 result: false
X: 1.60532150776053 Y: 1.6 result: false
X: 1.58314855875831 Y: 1.6 result: false
X: 1.61904761904762 Y: 1.6 result: false
X: 1.59637188208617 Y: 1.6 result: false
X: 1.63341067285383 Y: 1.6 result: false

リンクされた質問には、「xとyの両方が計算値である場合は、イプシロンを増やす必要があります」と書かれています。-どうすればそれを行い、トリミングするのに最適なピクセル数を見つけることができますか?

4

1 に答える 1

3

価値を得るために繰り返す必要はありません。x目的の比率が得られる目標値を計算し、余分なピクセルを削除します。

それxが大きすぎて、トリミングしたいとします。

// x/y should be 1.6
double neededRatio = 1.6d;

// so if we know y, then x should be:
int xTarget = (int)Math.Round(y * neededRatio);

// pixels to crop
int pixelsToCrop = x - xTarget;

[編集]

重要なのは、このコードは、到達xする必要のあるターゲットを取得することです(比率が必要であると想定しています)。それでもループが必要な場合は、次のことを妨げるものは何もありません。

while (x > xTarget)
{
    // crop 10 pixels
    // and do magic stuff
}
于 2012-02-03T00:56:02.800 に答える