2010-03-30 14 views
15

Gibt es eine einfache Möglichkeit, dies in 10.5 zu tun?Ein NSMage * in ein CGImageRef umwandeln?

In 10,6 I NSImage CGImageForProposedRect verwenden: NULL-Kontext: NULL Hinweise: NULL

Wenn ich nicht 1b Schwarz-Weiß-Bilder (wie Gruppe 4 TIFF) mit bin ich Bitmaps verwenden kann, aber cgbitmaps scheint nicht wie diese Einstellung ... Gibt es einen allgemeinen Weg, dies zu tun?

Ich muss dies tun, weil ich eine IKImageView habe, die nur CGImages hinzuzufügen scheint, aber alles, was ich habe, sind NSImages. Derzeit bin ich ein eigenes setImage mit: (NSImage *) Methode, die ich wirklich wirklich lieber nicht verwenden ...

+0

Weißt du, wo ich ein Beispiel dafür, wie CGImageForProposedRect verwenden zu können: NULL Kontext: NULL Hinweise: NULL. Ich liefere einen NSRect für den ersten Parameter, aber ich bekomme eine Typabweichung. – Brian

+0

Ich weiß nicht, ich habe es nie mit etwas außer NULL versucht ... möglicherweise ein CGRect anstelle eines NSRect? –

Antwort

27

fanden die folgende Lösung auf 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); 

Alle Methoden scheinen 10.4+ sein, also sollte es dir gut gehen.

+7

Ja, aber rufen Sie 'TIFFRepresentation' nicht hunderte von Malen. Abhängig von dem 'NSImage' kann es am Ende eine vollständige, unkomprimierte Kopie der Bilddaten im Speicher erzeugen. – Alex

+0

interessant. Ich werde es versuchen und dich wissen lassen. –

+0

Ausgezeichnet, das scheint zu funktionieren, danke! –

17

[Dies ist der lange Weg herum. Sie sollten dies nur tun, wenn Sie eine alte Version von OS X. noch sind die Unterstützung Wenn Sie 10.6 oder höher, just use the CGImage method stattdessen erfordern kann.]

  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. Geben Sie den Bitmap-Kontext frei.
+0

Ich habe es versucht, und es scheint entweder nicht mit 1 Bit S/W Bilder (Macs aus irgendeinem Grund wirklich nicht gerne mit CCITT TIFFs umgehen ...) oder verliert die Auflösung ... Da ich eine haben NSImage, ich bin mir nicht sicher, ob ich tatsächlich die Auflösung finden kann, um herauszufinden, wie man einen besseren Grafikkontext erstellt ... –

+0

Schauen Sie in das 'Repräsentations'-Array des Bildes. Einer von ihnen sollte ein Bitmap-Bild-Rep sein. Sie können dieses Objekt für die Größe in Pixeln (im Gegensatz zu Punkten) und anderen rasterbezogenen Fakten anfordern. –

+3

Peter, du bist ein Mitglied, das ich hier auf SO bewundere und vertraue. Danke für all das Wissen und die Erfahrung, die Sie teilen, und die Gründlichkeit, mit der Sie es präsentieren. – MikeyWard

12

Hier ist eine ausführlichere Antwort für die Verwendung von - 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

gerade tat dies mit 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

Sie benötigen keinen Grafikkontext wie in diesem Beispiel gezeigt. Es ist ein optionales Argument. – user487158