2010-07-26 16 views
7

Quiero escribir una función para reducir el tamaño de una imagen para que se ajuste a los límites especificados. Por ejemplo, quiero cambiar el tamaño de una imagen de 2000x2333 para que se ajuste a 1280x800. La relación de aspecto debe mantenerse. He llegado con el siguiente algoritmo:Algoritmo de cambio de tamaño de la imagen

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; 
} 

Y parecía funcionar. Bueno ... parecía. Pero luego traté de cambiar el tamaño de una imagen de 1280x1024 a un límite de 1280x800 y me dio un resultado de 1280x1024 (que obviamente no cabe en 1280x800).

¿Alguien tiene alguna idea de cómo debería funcionar este algoritmo?

Respuesta

26

La manera en que generalmente hago esto es observar la relación entre el ancho original y el nuevo ancho y la relación entre la altura original y la nueva altura.

Después de esto reducir la imagen por la mayor proporción. Por ejemplo, si desea cambiar el tamaño de una imagen de 800x600 en una imagen de 400x400, la relación de ancho sería 2 y la relación de altura sería 1.5. Reducir la imagen en una proporción de 2 da una imagen de 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

Oh Debo añadir por su ejemplo elenco de 1280x1024 a 1280x800 las proporciones serían 1 y 1,28, después de que el cambio de tamaño sería 1000 x 800 – GWW

+0

Gracias! ¡Creo que finalmente funciona! – Marius

6

Aquí está una manera de abordar el problema:

Usted sabe que, o bien la altura o anchura de la imagen será igual a la de la caja de contorno.

Una vez que haya determinado qué dimensión será igual a la del cuadro delimitador, use la relación de aspecto de la imagen para calcular la otra dimensión.

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

¿Qué es imageRatio? –

+0

@JonathanAquino Creo que se suponía que era 'sourceRatio'. Buena recogida. –

Cuestiones relacionadas