在CALayer上显示NSImage [英] Display NSImage on a CALayer

查看:300
本文介绍了在CALayer上显示NSImage的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've been trying to display a NSImage on a CALayer. Then I realised I need to convert it to a CGImage apparently, then display it...

我有这个代码似乎不工作

I have this code which doesn't seem to be working

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 或更高版本,请查看 NSImage 的CGImageForProposedRect:context:hints:方法。

If you're on OS X 10.6 or later, take a look at NSImage's CGImageForProposedRect:context:hints: method.

如果您不是,我已经在 NSImage 类别中:

If you're not, I've got this in a category on 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剥离。这是一个更旧的个人项目,我不记得。

I think I wrote this myself. But it's entirely possible that I ripped it off from somewhere else like Stack Overflow. It's an older personal project and I don't really remember.

这篇关于在CALayer上显示NSImage的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆