2012-02-25 20 views
11

Necesito dibujar imágenes en un CALayer porque necesito realizar varios efectos, animaciones y filtros en él. Cuando hago un simple dibujo en el CGContext, no importa lo que haga, siempre se dibuja pixelado ... ¿Cuál es la forma correcta de dibujar en un contexto en retina?CGContextDrawImage in Retina dibuja una imagen pixelada?

Esto es lo que estoy haciendo ahora:

CGImageRef plateImage = [[UIImage imageNamed:@"someImage"] CGImage]; 
CGFloat width = CGImageGetWidth(plateImage), height = CGImageGetHeight(plateImage); 
CGFloat scale = [[UIScreen mainScreen] scale]; 

NSLog(@"Scale: %f\nWidth: %f\nHeight: %f", scale, width, height); 
CGContextTranslateCTM(_context, 0, height/scale); 
CGContextScaleCTM(_context, 1.0, -1.0); 

CGContextDrawImage(_context, CGRectMake(0, 0, width/scale, height/scale), plateImage); 

Respuesta

18

Es necesario establecer la escala de los contenidos de la capa apropiada.

myLayer.contentsScale = [UIScreen mainScreen].scale 
+0

Aaaaaa! Estaba buscando en todos lados en los documentos de CG, ¡no pensé ni por un minuto que era un problema de capa! ¡Gracias! – shein

+0

Increíble. Gracias. – darkheartfelt

23

Tuve el mismo problema pero la solución no pareció funcionar.

UIGraphicsBeginImageContext() resultó ser la causa de mi problema. Estoy publicando mi solución aquí para futuros usuarios con el mismo problema.

Desde iOS 4.0 se debe utilizar:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 

en lugar de

UIGraphicsBeginImageContext(size); 

Si no desea que las imágenes pixeladas.

+0

¡Gracias! No puedo decir que entiendo por qué esto funciona, pero lo hace. – anonymouse

+2

¡Esta debería ser la respuesta correcta! – Fydo

+2

Merece la pena señalar que obtuve los mejores resultados combinando esto con la respuesta aceptada: 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, [UIScreen mainScreen] .scale);' – bplattenburg

Cuestiones relacionadas