2012-06-25 17 views
7

Problema: Tengo una imagen TIFF de varias páginas (generada con tiffutil) que contiene la misma imagen en múltiples píxeles desde 256x128 px hasta 4096x2048 px. Quiero mostrar esta imagen en un CALayer para que el sistema elija automáticamente la mejor representación de la imagen dependiendo del tamaño de la capa. Por el momento, la capa siempre usa la representación de 256x128 de la imagen, independientemente de su tamaño.Escalado automático de NIF TIFF multipágina en un CALayer

Aquí es lo que hago: me carga la imagen con

NSImage *image = [NSImage imageNamed:@"map-multipage.tiff"]; 

de registro del objeto image confirma que contiene múltiples representaciones con diferentes tamaños de pixel, pero todas las representaciones son del mismo tamaño en puntos (256x128). AFAIK así es como Apple recomienda construir imágenes de resolución múltiple.

NSLog(@"%@", image); 

<NSImage 0x100623060 Name=map-multipage Size={256, 128} Reps=(
    "NSBitmapImageRep 0x10064d330 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=256x128 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0", 
    "NSBitmapImageRep 0x10064e1b0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=512x256 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0", 
    ... 
    "NSBitmapImageRep 0x100530bd0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=4096x2048 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0" 
)> 

entonces asigno la instancia NSImage directamente a la propiedad de la capa contents:

self.layerView.layer.contents = image; 

Como se ha mencionado, el resultado es que la capa utiliza la primera representación (256x128 píxeles) para mostrar la imagen, sin tener en cuenta del tamaño de la capa en puntos o píxeles.

Cuando asigno la misma imagen a un NSImageView, funciona como se esperaba. La vista de imagen selecciona de forma transparente la mejor representación de imagen en función de su tamaño. Yo esperaría que CALayer funcionaría de la misma manera, pero aparentemente este no es el caso. ¿Alguien puede confirmar que CALayer no admite esta selección automática o estoy haciendo algo mal?

(Tenga en cuenta que esta pregunta no está directamente relacionada con gráficos HiDPI/Retina. De hecho, si muevo la capa a una pantalla en modo HiDPI, se vuelve un poco más nítida, lo que indica que ahora utiliza la segunda representación de mapa de bits (512x256 píxeles) para la representación. Esto sugiere que el automatismo para seleccionar una resolución más alta en una pantalla de obras HiDPI mientras que la selección fundamental de la mejor representación de mapa de bits falla.)

+0

Solo una idea, intente eliminar '.tiff' en' @ "map-multipage.tiff" '. Además, asegúrese de que 'layerContentsRedrawPolicy' no sea' Never'. ¿O tal vez influencias de 'contentsGravity 'de la capa cómo se está actualizando su contenido? – Stream

+1

@Stream: muchas gracias por las sugerencias. No, eliminar la extensión de archivo no tiene ningún efecto, ni tampoco jugar con 'layerContentsRedrawPolicy' o' contentsGravity'. Después de haber visto WWDC 2012 sesión 245 anoche, sospecho que la respuesta a mi pregunta es, no funciona de esa manera. Parece que los 'contenidos 'de' CALayer' no "saben" nada sobre el tamaño real de la capa en puntos/píxeles y, por lo tanto, no pueden seleccionar una representación de mapa de bits en función de esta información. –

+0

¡Tiene sentido! '- [CALayer contents]' es solo un mapa de bits, demasiado "tonto" para saber algo sobre su origen. Es 'CALayer' que se basa en la representación a través de' drawRect: inContext: '. Por lo tanto, cuando establece 'contents' directamente, su dimensión debe basarse en el actual' - [NSImagemage] '. – Stream

Respuesta

2

parece que el método AppKit -[CALayer setContents:] elige una representación de mapa de bits tamaño coincidente -[contents size] si contents objeto es NSImage. A continuación, el mapa de bits seleccionado se utiliza como está hasta que se vuelva a llamar al -[CALayer setContents:].

Cuestiones relacionadas