Я действительно слаб с математикой и имею проблему с алгоритмом изменения размера изображения. Я пытаюсь изменить размер изображения до определенного соотношения.Сравнение с двойной точностью в сравнении изображений
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
метод работы (я нашел его here). Иногда это не удается, и изображение получить обрезается до бесконечности, я пытался войти внутреннюю работу метода 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
Связанный вопрос говорит: «Если оба х и у вы должны увеличить эпсилон ». - Как мне это сделать и найти лучшее количество пикселей для обрезки?
Что делает код обрезки? Отрезать пиксели с более длинного края (или более короткого края), чтобы увеличить (или уменьшить) коэффициент? –
Да, 'if (imageRatio> neededShape)' cuts width, else cuts height – Madd0g
'1e-15' довольно мало, эффективно 0 в терминах разницы величин от 1,6e0. Что вы ищете как «близкое»? – user7116