2010-03-30 3 views
15

Есть ли простой способ сделать это, что работает в 10,5?Превращение NSImage * в CGImageRef?

В 10.6 можно использовать nsImage CGImageForProposedRect: NULL контексте: NULL намеков: NULL

Если я не использую 1b черно-белые изображения (например, Группа 4 TIFF), я могу использовать растровые изображения, но cgbitmaps, кажется, не такая настройка ... Есть ли общий способ сделать это?

Мне нужно сделать это, потому что у меня есть IKImageView, который, кажется, хочет добавить CGImages, но все, что у меня есть, - NSImages. В настоящее время я использую частный setImage: (NSImage *) метод, который я ДЕЙСТВИТЕЛЬНО РЕАЛЬНО, а не использовать ...

+0

Вы знаете, где я могу получить пример того, как использовать CGImageForProposedRect: NULL context: NULL hints: NULL. Я поставляю NSRect для первого параметра, но я получаю несоответствие типа на нем. – Brian

+0

Я не знаю, я никогда не пробовал его ни с чем, кроме NULL ... возможно, CGRect вместо NSRect? –

ответ

27

Найдено следующее решение по 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); 

Все методы кажутся чтобы быть 10.4+, так что все должно быть в порядке.

+7

Да, но не называйте 'TIFFRepresentation' сотни раз. В зависимости от 'NSImage', он может создать полную несжатую копию данных изображения в памяти. – Alex

+0

интересный. Я попробую это и дам вам знать. –

+0

Отлично, это похоже на работу! –

17

[Это длинный путь. Вы должны сделать это, только если вы все еще поддерживает старую версию OS X. Если вы можете потребовать 10.6 или более поздней версии, 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. Освободить контекст растрового изображения.
+0

Я пробовал это, и он либо кажется, что не работает с 1-битными черно-белыми изображениями (macs по какой-то причине действительно не любит иметь дело с CCITT TIFF ...) или теряет разрешение ... Так как у меня есть NSImage, я не уверен, что на самом деле могу найти решение, чтобы понять, как сделать лучший графический контекст ... –

+0

Посмотрите в массив 'представительств' изображения. Один из них должен быть изображением растрового изображения. Вы можете задать этот объект для размера в пикселях (в отличие от точек), среди других фактов, связанных с растром. –

+3

Питер, ты член, к которому я пришел, чтобы полюбоваться и доверять здесь. Благодарим вас за все знания и опыт, которыми вы делитесь, и за тщательность, с которой вы его представляете. – MikeyWard

12

Вот более подробный ответ для использования - 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

Просто сделал это с помощью 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

Вам не нужен графический контекст, как показано в этом примере. Это необязательный аргумент. – user487158

Смежные вопросы