Двойная точность сравнения изображений - PullRequest
1 голос
/ 03 февраля 2012

Я очень слабо разбираюсь в математике и имею проблемы с алгоритмом изменения размера изображения.Я пытаюсь изменить размер изображения до определенного соотношения.

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 - вычисленные значения, тогда вам нужно увеличить эпсилон. "- Как мне это сделать и найти лучшее количество пикселей для обрезки?

1 Ответ

3 голосов
/ 03 февраля 2012

Вам не нужно повторять, чтобы получить свою ценность. Вычислите целевое значение 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
}
...