我一直试图在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];


为什么?我该如何工作?

最佳答案

从注释:实际上,如果您使用的是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];
}


我想我自己写的。但是我很有可能将其从Stack Overflow之类的地方剥离下来。这是一个较旧的个人项目,我真的不记得了。

关于objective-c - 在CALayer上显示NSImage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4950892/

10-16 17:02