Изменение размера при сохранении соотношения сторон и округления до четных целых - PullRequest
4 голосов
/ 07 ноября 2011

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

Для каждой операции изменения размера у меня есть переменная «offset», которая указывает изменение ширины и высоты. Это основано на движении мыши, поэтому это может быть любая комбинация значений в зависимости от того, насколько сильно они двигали мышь при изменении размера.

То, что я делаю сейчас, - это взятие большего из двух значений (изменение x и y) и использование его для вычисления другого значения с тем же соотношением сторон. Вот мой код:

if (Math.Abs(offset.X) > Math.Abs(offset.Y))
{
    offset.Y = (int)(offset.X / AspectRatio);
}
else
{
    offset.X = (int)(offset.Y * AspectRatio);
}

Соотношение сторон является стандартным значением ширины / высоты.

Проблема с моим кодом в том, что он использует целочисленные значения, поэтому он округляется и вызывает искажение соотношения сторон.

Я предполагаю, что мне нужно привязаться к целочисленным значениям, которые делятся равномерно по соотношению сторон, или что-то для этого. Но я не знаю, как это сделать, изменив эти значения смещения x и y.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Делайте offset.X, .Y и AspectRatio с плавающей запятой / двойными числами, делайте любые вычисления, которые вам нужны, и только когда новые размеры вычисляются с округлением до целого числа.
Таким образом, вы получите максимально возможную точность.

P.S. Используйте Math.Round вместо простого приведения к int, это даст вам дополнительную точность.

1 голос
/ 07 ноября 2011

Я предполагаю, что мне нужно сделать привязку к целочисленным значениям, которые делятся равномерно по соотношению сторон, или что-то для этого. Но я не знаю, как это сделать, изменив эти значения смещения x и y.

Либо у вас будет несовершенное округление соотношения сторон, обрезка или короткие размеры. Подумайте об этом:

С каким соотношением сторон 3: 4, какой минимальный размер можно масштабировать по горизонтали и при этом точно соответствовать исходному соотношению?

Четыре пикселя.

Теперь измените соотношение сторон на два больших простых числа, и вы увидите проблему.

Вместо этого вы можете либо обрезать изображение в одном измерении, либо выполнить интерполяцию, используя фильтрацию изображения, и жить с не совсем идеальным изменением соотношения сторон.

Убедитесь, что ваши расчеты верны, правда. Рассчитайте соотношение сторон как значение с плавающей запятой и обрежьте до целого числа только при окончательном вычислении. В противном случае вы получите двойные ошибки округления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...