Prevención de antialiasing de CALayer renderInContext

Tengo una UIView muy simple que contiene algunos UIImageView s en blanco y negro. Si tomo una captura de pantalla a través de los botones físicos del dispositivo, la image resultante se ve exactamente igual a lo que veo (como se esperaba); si examino la image en el nivel de píxeles, solo será en blanco y negro.

Sin embargo, si utilizo el siguiente fragment de código para realizar la misma acción mediante progtwigción, la image resultante tiene lo que parece ser el suavizado aplicado: todos los píxeles negros están rodeados por halos grises débiles. No hay grises en mi escena original, es pura en blanco y negro y las dimensiones de la image de "captura de pantalla" es la misma que la que estoy generando programáticamente, pero no puedo entender de dónde proviene el halo gris.

 UIView *printView = fullView; UIGraphicsBeginImageContextWithOptions(printView.bounds.size, NO, 0.0); CGContextRef ctx = UIGraphicsGetCurrentContext(); [printView.layer renderInContext:ctx]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); UIGraphicsEndImageContext(); 

He intentado agregar lo siguiente antes de la llamada para renderInContext en un bash de evitar el antialiasing, pero no tiene efecto perceptible:

 CGContextSetShouldAntialias(ctx, NO); CGContextSetAllowsAntialiasing(ctx, NO); CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 

Aquí hay una muestra de las dos salidas diferentes: el lado izquierdo es lo que produce mi código y el lado derecho es una captura de pantalla normal de iOS:

introduzca la descripción de la imagen aquí

Dado que estoy intentando enviar la salida de my renderInContext a una impresora monocromática, tener píxeles grises provoca algo de artefactos desagradables debido al algorithm de difuminado de la impresora.

Entonces, ¿cómo puedo hacer renderInContext para producir la misma salida de nivel de píxel de mis vistas que una captura de pantalla real del dispositivo, es decir, solo en blanco y negro como lo que está en mi escena original?

Resulta que el problema estaba relacionado con la resolución del UIImage subyacente que usa UIImageView . El UIImage era una image CGImage creada con un proveedor de datos. Las dimensiones CGImage se especificaron en las mismas unidades que UIImageView padre, pero estoy usando un dispositivo iOS con una pantalla retina.

Debido a que las dimensiones CGImage se especificaron en un tamaño que no era de retina, renderInContext estaba renderInContext la CGImage y aparentemente esta mejora se comporta de manera diferente a lo que hace la representación real de la pantalla. (Por alguna razón, la representación de la pantalla real se amplió sin agregar píxeles grises).

Para solucionar esto, creé mi CGImage con el doble de la dimensión de UIImageView , luego mi llamada para renderInContext produce una image en blanco y negro mucho mejor. Todavía hay unos pocos píxeles grises en algunas áreas blancas, pero es una gran mejora sobre el problema original.

Finalmente me di count de esto cambiando la llamada a UIGraphicsBeginImageContextWithOptions() para obligarla a hacer una escala de 1.0 y noté que la representación de píxeles negros de UIImageView ya no tenía halo gris. Cuando UIGraphicsBeginImageContextWithOptions() a un factor de escala de 2.0 (que es lo que era el pnetworkingeterminado debido a la pantalla retina), apareció el halo gris.

Intentaría configurar el

  printView.layer.magnificationFilter 

y

  printView.layer.minificationFilter 

a

  kCAFilterNearest 

¿Se muestran las imágenes en instancias de UIImageView ? ¿ printView es su supervisión?