Pregunta

Estoy girando mi imagen con el siguiente código:

CGAffineTransform rotate = CGAffineTransformMakeRotation( [ratio floatValue] );
[imageView setTransform:rotate];

Pero no tiene bordes afilados, ¿alguien sabe una solución para esto?

Aquí está la imagen que obtengo:

ingrese la descripción de la imagen aquí

¿Fue útil?

Solución

Los bordes de la imagen en sí se ven irregulares porque se colocan directamente en una cuadrícula de píxeles y no se interpolan. La interpolación vecina más cercana es el tipo de interpolación más simple, donde si tiene una cuadrícula de píxeles A y mueve su imagen a la cuadrícula B de píxeles, los píxeles en la cuadrícula B se eligen simplemente eligiendo el píxel más cercano de la cuadrícula A. Otras formas de interpolación eligen un promedio ponderado de los píxeles más cercanos para llegar al valor de píxel en la cuadrícula B.

Su imagen, con sus bordes irregulares, parece que está utilizando la interpolación de vecino más cercano, que puede ser el tipo de interpolación predeterminado en una transformación afín en un iphone.

Cuando utiliza algún otro esquema de interpolación que no sea el vecino más cercano, obtendrá aliasing efectos, donde el submuestreo no es perfecto cuando se transfiere de una cuadrícula de píxeles a otra. Ese efecto hace que los bordes de la imagen parezcan más borrosos de lo que lo harían de otra manera.

Otros consejos

Usar el CALayer de UIImageView para rasterizar la imagen proporcionará el mejor antialiasing.

imageView.layer.shouldRasterize = YES;

simplemente agregue 1px borde transparente a su imagen

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext( imageRect.size ); 
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Cada vez que realice transformaciones en una imagen (excepto en incrementos de 90 & # 176;) causará bordes ligeramente más suaves debido a la interpolación de píxeles.

Hay una clave que puede establecer en Info.plist que permite el antialiasing de los bordes: UIViewEdgeAntialiasing.

Como se describe en la siguiente respuesta: Cuando giro un UIImageView con la propiedad de transformación, los bordes se pixelan

La solución más simple:

  

Simplemente agregue este par clave-valor a su Info.plist:   UIViewEdgeAntialiasing establecido en YES.

https://stackoverflow.com/a/12066215/1469060

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top