2012-02-03 4 views
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 метод работы (я нашел его 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 

Связанный вопрос говорит: «Если оба х и у вы должны увеличить эпсилон ». - Как мне это сделать и найти лучшее количество пикселей для обрезки?

+0

Что делает код обрезки? Отрезать пиксели с более длинного края (или более короткого края), чтобы увеличить (или уменьшить) коэффициент? –

+0

Да, 'if (imageRatio> neededShape)' cuts width, else cuts height – Madd0g

+1

'1e-15' довольно мало, эффективно 0 в терминах разницы величин от 1,6e0. Что вы ищете как «близкое»? – user7116

ответ

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 
} 
+0

Мне нужно это по-своему, потому что я режу с обеих сторон и применяю дополнительную логику при обрезке, она должна быть с петлей – Madd0g

+0

@ Madd0g: можете ли вы немного подробнее? Какая дополнительная логика? Вам нужно добраться до целевого значения, так или иначе. Я вообще не коснулся кода обрезки, поэтому, если вы хотите уменьшить 'x' несколькими шагами, пока не достигнете' xTarget', я не понимаю, почему вы не смогли этого сделать. Но я тоже не вижу, почему вы должны это сделать. Вы можете обновить свой вопрос, добавить примерное измерение и то, что и как вы его обрезаете. – Groo

+0

Возьмите половину пикселей для обрезки слева, наполовину справа? – user7116

Смежные вопросы