2010-07-26 3 views
7

Я хочу написать функцию для уменьшения размера изображения в соответствии с указанными границами. Например, я хочу изменить размер изображения 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).

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

ответ

26

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

После этого сжимается изображение по самому большому коэффициенту. Например, если вы хотите изменить размер изображения 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; 
} 
+0

О, я должен добавить для примера склада 1280x1024 до 1280x800 отношений будут 1 и 1,28, после того, как изменить размер будет 1000 х 800 – GWW

+0

Спасибо! Я думаю, что это, наконец, работает! – Marius

6

Вот способ подойти к проблеме:

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

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

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

Что такое imageRatio? –

+0

@JonathanAquino Я думаю, что это должно было быть 'sourceRatio'. Хороший пикап. –

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