2012-02-02 9 views
6

He probado la categoría UIImage + Resize que es popular, y con diferentes configuraciones de interpolación. He intentado escalar a través de métodos CG y CIFilters. Sin embargo, nunca puedo obtener una imagen reducida que no se vea levemente enfocada, ni llena de artefactos dentados. ¿Hay alguna otra solución, o una biblioteca de terceros, que me permita obtener una imagen muy nítida?Cómo escalar una imagen en iOS, suavizada pero no suave?

Debe ser posible en el iPhone, porque, por ejemplo, la aplicación Fotos mostrará una imagen nítida incluso cuando pellizque para reducirla.

Respuesta

6

Usted dijo CG, pero no especificó su enfoque.

Usando dibujo o mapa de bits contexto:

CGContextSetInterpolationQuality(gtx, kCGInterpolationHigh); 
CGContextSetShouldAntialias(gtx, true); << default varies by context type 
CGContextDrawImage(gtx, rect, image); 

y asegurarse de que sus puntos de vista y sus capas no cambie el tamaño de la imagen de nuevo. He tenido buenos resultados con esto. Es posible que otras vistas estén afectando su vista o el contexto. Si no se ve bien, pruébelo de forma aislada para comprobar si algo distorsiona su vista/imagen o no.

Si está dibujando en un mapa de bits, entonces crea el mapa de bits con las dimensiones del objetivo, luego dibuje a ese.

Idealmente, mantendrá la relación de aspecto.

También tenga en cuenta que esto puede requerir una gran cantidad de CPU: dibujar/escalar repetidamente en HQ costará mucho tiempo, por lo que puede querer crear una copia redimensionada (usando CGBitmapContext).

+0

He estado utilizando un contexto de gráficos UI y el dibujo a través de drawInRect o drawAtPoint, así como esto. Sin embargo, me obligaste a volver a mirar mi código y me di cuenta de que se debía a otro aspecto de mi código. – akaru

+0

sí - es una buena idea ser explícito sobre la configuración de los contextos gráficos, ya que estos y otros aspectos del sistema de gráficos pueden variar mucho. – justin

0

Cuando una imagen ha sido reducida, a menudo es una buena idea para aplicar un poco de nitidez.

El problema es que Core Image en iOS todavía no implementa los filtros de nitidez (CISharpenLuminance, CIUnsharpMask), por lo que tendría que hacer el suyo propio. O regañar a Apple hasta que implementen estos filtros en iOS, también.

Sin embargo, la luminancia de nitidez y la máscara de enfoque son filtros bastante avanzados, y en proyectos anteriores he encontrado que incluso un simple núcleo de 3x3 produciría resultados claramente visibles y satisfactorios.

Por lo tanto, si tiene ganas de trabajar a nivel de píxel, puede obtener los datos de imagen de un contexto gráfico, máscara de bits a valores R, G y B y gráficos de código como en 1999. se asemeja un poco a reinventar la rueda.

tal vez hay algunas bibliotecas de gráficos estándar alrededor que pueden hacer esto, también (ImageMagick?)

4

Aquí es la rutina que escribí para hacer esto. Hay un poco de enfoque suave, aunque dependiendo de qué tan lejos esté escalando la imagen original no es tan malo. Estoy escalando las imágenes de Screen Screentics.

- (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize { 

    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 
Cuestiones relacionadas