Алгоритм изменения размера изображения - PullRequest
11 голосов
/ 26 июля 2010

Я хочу написать функцию, чтобы уменьшить изображение, чтобы оно соответствовало указанным границам.Например, я хочу изменить размер изображения 2000x2333, чтобы оно соответствовало 1280x800.Соотношение сторон должно быть сохранено.Я придумал следующий алгоритм:

NSSize mysize = [self pixelSize]; // just to get the size of the original image
int neww, newh = 0;
float thumbratio = width / height; // width and height are maximum thumbnail's bounds
float imgratio = mysize.width / mysize.height;

if (imgratio > thumbratio)
{
    float scale = mysize.width / width;
    newh = round(mysize.height / scale);
    neww = width;
}
else
{
    float scale = mysize.height / height;
    neww = round(mysize.width / scale);
    newh = height;
}

И, похоже, он работает.Ну ... казалось.Но затем я попытался изменить размер изображения 1280x1024 до 1280x800 границ, и это дало мне результат 1280x1024 (который явно не подходит для 1280x800).

У кого-нибудь есть идеи, как этот алгоритм должен работать?

Ответы [ 2 ]

26 голосов
/ 26 июля 2010

Обычно я делаю это, чтобы посмотреть на соотношение между исходной шириной и новой шириной и соотношение между исходной высотой и новой высотой.

После этого уменьшите изображение до наибольшего соотношения.Например, если вы хотите изменить размер изображения 800x600 в изображение 400x400, соотношение ширины будет равно 2, а соотношение высоты будет равно 1,5.Сжатие изображения в соотношении 2 дает изображение 400x300.

NSSize mysize = [self pixelSize]; // just to get the size of the original image
int neww, newh = 0;
float rw = mysize.width / width; // width and height are maximum thumbnail's bounds
float rh = mysize.height / height;

if (rw > rh)
{
    newh = round(mysize.height / rw);
    neww = width;
}
else
{
    neww = round(mysize.width / rh);
    newh = height;
}
8 голосов
/ 14 марта 2013

Вот способ решения проблемы:

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

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

double sourceRatio = sourceImage.Width / sourceImage.Height;
double targetRatio = targetRect.Width / targetRect.Height;

Size finalSize;
if (sourceRatio > targetRatio)
{
    finalSize = new Size(targetRect.Width, targetRect.Width / sourceRatio);
}
else
{
    finalSize = new Size(targetRect.Height * sourceRatio, targetRect.Height);
}
...