2010-03-30 16 views
15

¿Hay una manera fácil de hacer esto que funciona en el 10,5?Convirtiendo un NSImage * en un CGImageRef?

En 10,6 puedo usar NSImage CGImageForProposedRect: contexto NULL: NULL: NULL consejos

Si no estoy usando 1b imágenes en blanco y negro (como TIFF Grupo 4), que puedo usar mapas de bits, pero parecen cgbitmaps no como esa configuración ... ¿Hay una manera general de hacer esto?

tengo que hacer esto porque tengo una IKImageView que sólo parece querer añadir CGImages, pero todo lo que tengo son NSImages. Actualmente, estoy usando un setImage privada: (NSImage *) método que yo realmente realmente preferiría no estar usando ...

+0

¿Usted sabe donde puedo conseguir un ejemplo de cómo utilizar CGImageForProposedRect: NULL contexto: sugerencias NULL: NULL. Estoy suministrando un NSRect para el primer parámetro, pero obtengo un error de tipo en él. – Brian

+0

No sé nunca he tratado con nada excepto NULL ... posiblemente un CGRect en lugar de un NSRect? –

Respuesta

27

encontró lo siguiente solución en this page:

NSImage* someImage; 
// create the image somehow, load from file, draw into it... 
CGImageSourceRef source; 

source = CGImageSourceCreateWithData((CFDataRef)[someImage TIFFRepresentation], NULL); 
CGImageRef maskRef = CGImageSourceCreateImageAtIndex(source, 0, NULL); 

Todos los métodos parecen ser 10.4+ así que deberías estar bien.

+7

Sí, pero no llamar 'TIFFRepresentation' cientos de veces. Según el "NSImage", puede terminar creando una copia completa sin comprimir de los datos de imagen en la memoria. – Alex

+0

interesante. Lo intentaré y te lo haré saber. –

+0

Excelente, esto parece funcionar gracias! –

17

[Este es el camino más largo. Sólo debe hacer esto si todavía está apoyando una versión antigua de OS X. Si puede requerir 10.6 o posterior, just use the CGImage method lugar.]

  1. Create a CGBitmapContext.
  2. Create an NSGraphicsContext for the bitmap context.
  3. Set the graphics context as the current context.
  4. Draw the image.
  5. Create the CGImage from the contents of the bitmap context.
  6. lanzamiento el contexto de mapa de bits.
+0

He intentado esto, y parece que no funciona con imágenes B/N de 1 bit (por alguna razón, los Mac realmente no les gusta tratar con CCITT TIFF ...) o pierde resolución ... Como tengo una NSImage, no estoy seguro de que pueda ENCONTRAR la resolución para descubrir cómo crear un mejor contexto de gráficos ... –

+0

Mire en la matriz de 'representaciones' de la imagen. Uno de ellos debe ser un representante de imagen de mapa de bits. Puede pedir ese objeto para el tamaño en píxeles (en lugar de puntos), entre otros hechos relacionados con la trama. –

+3

Peter, eres un miembro que he llegado a admirar y en el que confío aquí. Gracias por todo el conocimiento y la experiencia que comparte, y la minuciosidad con la que lo presenta. – MikeyWard

12

Aquí es una respuesta más detallada para el uso de - CGImageForProposedRect:context:hints::

NSImage *image = [NSImage imageNamed:@"image.jpg"]; 

NSRect imageRect = NSMakeRect(0, 0, image.size.width, image.size.height); 

CGImageRef cgImage = [image CGImageForProposedRect:&imageRect context:NULL hints:nil]; 
1

Sólo hizo esto utilizando CGImageForProposedRect:context:hints: ...

NSImage *image; // an image 
NSGraphicsContext *context = [NSGraphicsContext currentContext]; 
CGRect imageCGRect = CGRectMake(0, 0, image.size.width, image.size.height); 
NSRect imageRect = NSRectFromCGRect(imageCGRect); 
CGImageRef imageRef = [image CGImageForProposedRect:&imageRect context:context hints:nil]; 
+0

No necesita un contexto de gráficos como se muestra en este ejemplo. Es un argumento opcional. – user487158