2011-10-05 6 views
7

Si creo una NSImage a través de algo como:tratando de convertir [NSImage imageNamed: NSImageNameUser] en NSData

NSImage *icon = [NSImage imageNamed:NSImageNameUser]; 

que sólo tiene una representación, un NSCoreUIImageRep que parece ser una clase privada.

me gustaría archivar esta imagen como una NSData pero si pido la TIFFRepresentation me sale un pequeño icono cuando el verdadero NSImage he creado originalmente parecía ser vectorial y se escala hasta llenar mis puntos de vista de imagen muy bien.

Tenía la esperanza de que las imágenes creadas de este modo tuvieran un NSPDFImageRep que podría usar.

¿Alguna idea de cómo puedo obtener un NSData (pref la versión de vector o en el peor una versión de mapa de bits de gran escala) de este NSImage?

ACTUALIZACIÓN

habló con algunas personas on Twitter y sugirió que el verdadero origen de estas imágenes son multi resolución icns archivos (vector probablemente no en todos). No pude encontrar la ubicación de estos en el disco, pero es interesante escuchar nada menos.

Además, sugirieron que creara el NSImage del sistema y lo renderizara manualmente en un NSI de alta resolución propio. Estoy haciendo esto ahora y está trabajando para mis necesidades. Mi código:

+ (NSImage *)pt_businessDefaultIcon 
{ 
    // Draws NSImageNameUser into a rendered bitmap. 
    // We do this because trying to create an NSData from 
    // [NSImage imageNamed:NSImageNameUser] directly results in a 32x32 image. 
    NSImage *icon = [NSImage imageNamed:NSImageNameUser]; 
    NSImage *renderedIcon = [[NSImage alloc] initWithSize:CGSizeMake(PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize)]; 
    [renderedIcon lockFocus]; 
    NSRect inRect = NSMakeRect(0, 0, PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize); 
    NSRect fromRect = NSMakeRect(0, 0, icon.size.width, icon.size.width);; 
    [icon drawInRect:inRect fromRect:fromRect operation:NSCompositeCopy fraction:1.0]; 
    [renderedIcon unlockFocus]; 

    return renderedIcon; 
} 

(? Intentado publicar esto como mi respuesta, pero no tengo la reputación suficiente)

+0

Tu pregunta me ha resultado útil y tu respuesta ha funcionado. – Guillaume

Respuesta

4

Parece que está ignorando la documentación. Sus dos preguntas principales se responden allí. El Cocoa Drawing Guide (guía complementaria vinculada desde la referencia de la API NSImage) tiene una sección de Imágenes que realmente necesita leer detenidamente y consultar cuando tenga problemas de rep/caché/tamaño/calidad.

... si pido la TIFFRepresentation que consigue un pequeño icono cuando el verdadera NSImage he creado originalmente parecía ser vectorial y escalaría para llenar mis puntos de vista de imagen muy bien.

Las subsecciones pertinentes de la sección Imágenes para esta pregunta son: Cómo se elige una Representación de imagen, Imágenes y Almacenamiento en caché, y Tamaño y resolución de imagen. De forma predeterminada, el -cacheMode para una imagen TIFF "se comporta como si la configuración NSImageCacheBySize estuviera en efecto". Además, para operaciones de escalado/dimensionamiento en memoria, -imageInterpolation es importante: "La Tabla 6-4 enumera las configuraciones de interpolación disponibles". y "NSImageInterpolationHigh - Más lenta, interpolación de mayor calidad".

Estoy bastante seguro de que esto se aplica a una imagen de sistema con nombre así como a cualquier otra.

que estaba esperando un poco las imágenes hechas [mediante la carga de una imagen de disco] habría tener un NSPDFImageRep que podría utilizar.

Subsección pertinente: Representaciones de imagen. "... con imágenes basadas en archivos, la mayoría de las imágenes que crea solo necesitan una representación de imagen única". y "Puede crear múltiples representaciones en las siguientes situaciones, sin embargo: para la impresión, es posible que desee crear una representación en PDF o un mapa de bits de alta resolución de su imagen".

Obtiene la representación que se adapta a la imagen cargada. Debe crear una representación de PDF para una imagen TIFF, por ejemplo. Para hacerlo a alta resolución, deberás consultar el modo de almacenamiento en caché para poder obtener elementos de mayor resolución.

Hay lote de detalles finos demasiado numerosos para enumerar debido a la gran cantidad de permutaciones de imágenes/mecanismos de creación/configuraciones/y lo que quiere hacer con todo. Mi publicación está destinada a ser una guía general para encontrar la información específica que necesita para su situación.

Para obtener más detalles, agregue detalles específicos: el código que intentó usar, el tipo de imagen que está cargando o creando, parecía mencionar dos posibilidades diferentes en su cuarto párrafo, y qué salió mal.

+0

Gracias por la información y el enlace de documentación. De hecho, no me encontré con eso cuando busqué archivar NSImages. – zorn

0

yo supongo que la imagen es "cableado" en el sistema de gráficos de alguna manera, y la representación del NSImage del mismo es simplemente un número que indica qué gráfico de cableado es. Entonces lo que necesita hacer es dibujarlo y luego capturar el dibujo.

De manera muy general, cree un controlador de vista que va a representar la imagen, hacer referencia a la propiedad del VC view para hacer que la vista que se prestarán, extraer el contentView de la CV, obtener el contentView.layer, hacer que el layer en un contexto UIGraphics, conseguir UIImage del contexto, extraiga la representación que desee del UIImage.

(Puede haber una manera más sencilla, pero esta es la que terminó usando en un caso.)

(Y, suspiro, supongo que este esquema no conserva la ampliación tampoco.)

+0

Lamentablemente, su admisión de escalamiento es exactamente cierta aquí. Esta no es una solución universal. De hecho, no hay una solución universal para los hechos dados. Depende de cómo se crea la imagen (en la memoria o cargada desde el disco), cuáles son sus configuraciones de caché e interpolación, y si las representaciones existentes se pueden escalar o si se requiere crear y dibujar en una nueva representación con el tamaño/calidad. –