2010-03-30 21 views
15

C'è un modo semplice per farlo in 10.5?Trasformare un NSImage * in un CGImageRef?

Nel 10,6 posso utilizzare NSImage CGImageForProposedRect: contesto NULL: NULL: NULL suggerimenti

Se io non sto usando 1b immagini in bianco e nero (come Gruppo 4 TIFF), posso usare bitmap, ma cgbitmaps sembrano non come quell'impostazione ... C'è un modo generale per farlo?

Ho bisogno di fare questo perché ho un IKImageView che sembra voler solo aggiungere CGImages, ma tutto quello che ho sono NSImages. Attualmente, sto usando un setImage privato: (NSImage *) metodo che mi piacerebbe davvero davvero piuttosto non utilizzerò ...

+0

Sapete dove posso trovare un esempio di come utilizzare CGImageForProposedRect: NULL contesto: suggerimenti NULL: NULL. Fornisco un NSRect per il primo parametro ma sto riscontrando una mancata corrispondenza di tipo su di esso. – Brian

+0

Non so che non l'ho mai provato con nulla tranne NULL ... forse un CGRect invece di un NSRect? –

risposta

27

trovato la seguente soluzione sul 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); 

Tutti i metodi sembrano essere 10.4+ quindi dovresti stare bene.

+7

Sì, ma non chiamare 'TIFFRepresentation' centinaia di volte. A seconda di 'NSImage', può finire per creare una copia completa e non compressa dei dati dell'immagine in memoria. – Alex

+0

interessante. Ci proverò e ti farò sapere. –

+0

Eccellente, sembra funzionare grazie! –

17

[Questa è la strada più lunga. Si dovrebbe fare solo se si sta ancora sostenendo una vecchia versione di OS X. Se è possibile richiedere 10.6 o versioni successive, invece just use the CGImage method.]

  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. Rilasciare il contesto bitmap.
+0

Ho provato questo, e sembra non funzionare con immagini B/N a 1 bit (i Mac per qualche ragione non mi piacciono molto con i CCITT TIFF ...) o perde la risoluzione ... Dato che ho un NSImage, non sono sicuro di poter effettivamente trovare la risoluzione per capire come creare un contesto grafico migliore ... –

+0

Cerca nell'array 'representations' dell'immagine. Uno di questi dovrebbe essere un rappresentante di immagini bitmap. Puoi chiedere a quell'oggetto la dimensione in pixel (in contrapposizione ai punti), tra gli altri fatti correlati a raster. –

+3

Peter, sei un membro che sono venuto ad ammirare e ad avere fiducia in SO. Grazie per tutta la conoscenza e l'esperienza che condividi e per la completezza con cui la presenti. – MikeyWard

12

Ecco una risposta più dettagliata per l'utilizzo di - 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

Appena fatto questo utilizzando 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

Non è necessario un contesto grafico come mostrato in questo esempio. È un argomento facoltativo. – user487158

Problemi correlati