Tengo una secuencia de NSViews fuera de pantalla en una aplicación Cocoa, que se utilizan para componer un PDF para imprimir. Las vistas no están en una ventana NSW, o son visibles de ninguna manera.Generar imagen escalada desde fuera de la pantalla NSView
Me gustaría poder generar imágenes en miniatura de esa vista, exactamente como se vería en el PDF, pero reducida para ajustarse a un determinado tamaño de píxel (restringido a un ancho o alto). Esto debe ser lo más rápido posible, por lo que me gustaría evitar renderizar en PDF, luego convertir a ráster y escalar. Me gustaría ir directamente al ráster.
En el momento que estoy haciendo:
NSBitmapImageRep *bitmapImageRep = [pageView bitmapImageRepForCachingDisplayInRect:pageView.bounds];
[pageView cacheDisplayInRect:pageView.bounds toBitmapImageRep:bitmapImageRep];
NSImage *image = [[NSImage alloc] initWithSize:bitmapImageRep.size];
[image addRepresentation:bitmapImageRep];
Este enfoque funciona bien, pero no puedo encontrar la manera de aplicar una escala a la NSView antes de dibujar la bitmapImageRep. Quiero evitar el uso de scaleUnitSquareToSize
, porque tal como lo entiendo, eso solo cambia los límites, no el marco de NSView.
¿Alguna sugerencia sobre la mejor manera de hacerlo?
Estaba usando 'bitmapImageRepForCacheDisplayInRect:' y 'cacheDisplayInRect: toBitmapImageRep:' para generar miniaturas dinámicamente para una aplicación de notebook en el momento del lanzamiento. Con más de 40 páginas (NSView alojados en capas) con mucho contenido visual, generar miniaturas tardaba cerca de 90 segundos. Este no era el caso en las versiones anteriores de macOS. Reemplacé este método con el enfoque de @ tomtaylor anterior, usando una escala de 1.0 (ya que necesito miniaturas para escalar fluidamente hacia arriba a tamaño completo) y la generación de miniaturas cayó a 20 segundos (fondo), ¡con aproximadamente la mitad del uso de memoria virtual! – Dalmazio