在CALayer上显示NSImage

Seb*_*hec 2 cocoa objective-c

我一直试图在CALayer上显示NSImage.然后我意识到我需要将它显然转换为CGImage,然后显示它......

我有这个代码似乎没有工作

CALayer *layer = [CALayer layer];

    NSImage *finderIcon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kFinderIcon)];
    [finderIcon setSize:(NSSize){ 128.0f, 128.0f }];

    CGImageSourceRef source;
    source = CGImageSourceCreateWithData((CFDataRef)finderIcon, NULL);
    CGImageRef finalIcon =  CGImageSourceCreateImageAtIndex(source, 0, NULL);

    layer.bounds = CGRectMake(128.0f, 128.0f, 4, 4);
    layer.position = CGPointMake(128.0f, 128.0f);
    layer.contents = finalIcon;

        // Insert the layer into the root layer
    [mainLayer addSublayer:layer];
Run Code Online (Sandbox Code Playgroud)

为什么?我怎样才能让它发挥作用?

Jam*_*ams 6

从评论:实际上,如果你在10.6,你也可以将CALayer的内容设置为NSImage而不是CGImageRef ......


如果你在OS X 10.6或更高版本,看一看NSImageCGImageForProposedRect:context:hints:方法.

如果你不是,我在以下类别中有这个NSImage:

-(CGImageRef)CGImage
{
    CGContextRef bitmapCtx = CGBitmapContextCreate(NULL/*data - pass NULL to let CG allocate the memory*/, 
                                                   [self size].width,  
                                                   [self size].height, 
                                                   8 /*bitsPerComponent*/, 
                                                   0 /*bytesPerRow - CG will calculate it for you if it's allocating the data.  This might get padded out a bit for better alignment*/, 
                                                   [[NSColorSpace genericRGBColorSpace] CGColorSpace], 
                                                   kCGBitmapByteOrder32Host|kCGImageAlphaPremultipliedFirst);

    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:bitmapCtx flipped:NO]];
    [self drawInRect:NSMakeRect(0,0, [self size].width, [self size].height) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
    [NSGraphicsContext restoreGraphicsState];

    CGImageRef cgImage = CGBitmapContextCreateImage(bitmapCtx);
    CGContextRelease(bitmapCtx);

    return (CGImageRef)[(id)cgImage autorelease];
}
Run Code Online (Sandbox Code Playgroud)

我自己写了这个.但是我完全有可能将它从像Stack Overflow这样的其他地方撕掉.这是一个较旧的个人项目,我真的不记得了.

  • 实际上,如果你使用10.6,你也可以将`CALayer`的内容设置为`NSImage`而不是`CGImageRef` .... (12认同)
  • 是的,NSGod是对的.代码就像layer.contents = theNSImageInstance一样简单; (2认同)