将NSImage *转换为CGImageRef?

时间:2010-03-30 19:27:20

标签: objective-c cocoa core-graphics nsimage cgimage

有一种简单的方法可以在10.5中运行吗?

在10.6中我可以使用nsImage CGImageForProposedRect:NULL context:NULL提示:NULL

如果我不使用1b黑白图像(如Group 4 TIFF),我可以使用位图,但cgbitmaps似乎不喜欢这种设置......有没有一般的方法来做到这一点?

我需要这样做因为我有一个看似只想添加CGImages的IKImageView,但我所拥有的只是NSImages。目前,我正在使用一个私有的setImage:(NSImage *)方法,我真的很想不使用...

6 个答案:

答案 0 :(得分:28)

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+,所以你应该没问题。

答案 1 :(得分: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. 释放位图上下文。

答案 2 :(得分:16)

从Snow Leopard开始,你只需ask the image to create a CGImage for you,就可以向NSImage发送一条CGImageForProposedRect:context:hints:消息。

答案 3 :(得分:14)

以下是使用- 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];

答案 4 :(得分: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];

答案 5 :(得分:0)

从 2021 年开始,CALayers contents 可以直接与 NSImage 一起提供,但您仍然可能会收到
[Utility] unsupported surface format: LA08 警告。 经过几天的研究和测试,我发现如果您创建了一个带有 backingLayer(又名 CALayer)的 NSView 并且只是使用 NSImage 来提供它的 contents,则会触发此警告。仅此一点问题不大。但是如果你尝试通过 [self.layer renderInContext:ctx] 渲染它,每次渲染都会再次触发警告。

为了简单起见,我创建了一个 NSImage 扩展来解决这个问题..

@interface NSImage (LA08FIXExtension)
-(id)CGImageRefID;
@end

@implementation NSImage (LA08FIXExtension)

-(id)CGImageRefID {
    NSSize size = [self size];
    NSRect rect = NSMakeRect(0, 0, size.width, size.height);
    CGImageRef ref = [self CGImageForProposedRect:&rect context:[NSGraphicsContext currentContext] hints:NULL];
    return (__bridge id)ref;
}

@end

看看它如何不直接返回 CGImageRef 而是桥接转换到 id ..!这可以解决问题。

现在你可以像......一样使用它

CALayer *somelayer = [CALayer layer];
somelayer.frame = ... 
somelayer.contents = [NSImage imageWithName:@"SomeImage"].CGImageRefID;

PS:发布她是因为如果你也遇到这个问题,谷歌无论如何都会把你带到这个答案线程,上面的所有答案都启发了我进行这个修复。