2010-10-10 14 views
7

Quiero escalar un UIImage de tal manera que el usuario pueda ver los píxeles en el UIImage muy nítidos. Cuando lo pongo en un UIImageView y escala la matriz de transformación, el UIImage aparece suavizado y suavizado.¿Cómo escalar un UIImage sin suavizar nada?

¿Hay alguna manera de representar en un contexto de mapa de bits más grande simplemente repitiendo cada fila y cada columna para obtener píxeles más grandes? ¿Cómo podría hacer eso?

+0

¿Cuál es su factor de escala? Tenga en cuenta que solo para x2, x3, x4 etc. puede esperar obtener resultados "nítidos". – Eiko

+1

Tenga en cuenta que este método se conoce como interpolación del vecino más cercano. – BoltClock

Respuesta

20

#import <QuartzCore/CALayer.h>

view.layer.magnificationFilter = kCAFilterNearest

+3

Tenga en cuenta que esto no funciona si creó el UIImage para UIImageView con [UIImage imageWithCIImage: ci]; – marcelnijman

+2

Además, use 'view.layer.shouldRasterize = YES'. Esto es para evitar el problema donde algunas imágenes muestran 4 píxeles por cada píxel. –

+0

@PeterDeWeese, eso es genial y cumple mi propósito, pero quiero preguntar, cuando uso 'magnificationFilter = kCAFilterNearest', ¿los píxeles grandes y nítidos magnifican realmente los píxeles originales de la imagen, o simplemente se producen mediante algún procesamiento? Gracias ! – Suge

2

Al dibujar directamente en el contexto de mapa de bits, podemos utilizar:

CGContextSetInterpolationQuality(myBitmapContext, kCGInterpolationNone); 

He encontrado esto en CGContextDrawImage very slow on iPhone 4

+0

¡Esa es la respuesta que estaba buscando! – fpg1503

1

También estaba tratando este (en una subcapa) y no pude hacer que funcionara, todavía estaba borroso. Esto es lo que tenía que hacer:

const CGFloat PIXEL_SCALE = 2; 
layer.magnificationFilter = kCAFilterNearest; //Nearest neighbor texture filtering 
layer.transform = CATransform3DMakeScale(PIXEL_SCALE, PIXEL_SCALE, 1); //Scale layer up 
//Rasterize w/ sufficient resolution to show sharp pixels 
layer.shouldRasterize = YES; 
layer.rasterizationScale = PIXEL_SCALE; 
+0

Gracias por el downvotes drive-by ... ¿te importa explicar el problema con esta respuesta? – Eliot

-1

Para UIImage creado a partir de CIImage se puede utilizar:

imageView.image = UIImage(CIImage: ciImage.imageByApplyingTransform(CGAffineTransformMakeScale(kScale, kScale)))