2011-02-09 6 views
1

私はCALayerにNSImageを表示しようとしています。それから私は私がCALayerにNSImageを表示

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]; 

なぜ動作していないようです。このコードを持って

...それを表示し、明らかにCGImageに変換する必要があり実現しましたか?これをどのように機能させることができますか?コメントから

答えて

6

:あなたは10.6にしている場合は、にしている場合はは実際に、あなたもちょうど


... NSImageではなく、CGImageRefへのCALayerの内容を設定することができます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]; 
} 

私は私はこれを自分で書いたと思います。しかし、スタックオーバーフローのような場所からそれを切り取った可能性は全くあります。それはより古い個人的なプロジェクトであり、私は本当に覚えていません。

+12

実際には10.6になっている場合、 'CGImageRef'ではなく、' CALayer'の内容を 'NSImage'に設定することもできます.... – NSGod

+0

本当に??コード?? –

+2

ええ、NSGodが正しいです。コードは文字通りlayer.contents = theNSImageInstanceと同じくらい単純です。 –

2

ここにあなたを助けるかもしれないコードがあります - 私は確かに、これのフォーマットが起こっているようにすべてがうんざりしないようにしてください - 私が提供できるのは、これが私のために働くということです。

// ------------------------------------------------------------------------------------- 

- (void)awakeFromNib 
    { 
    // setup our main window 'contentWindow' to use layers 
    [[contentWindow contentView] setWantsLayer:YES]; // NSWindow* 

    // create a root layer to contain all of our layers 
    CALayer *root = [[contentWindow contentView] layer]; 
    // use constraint layout to allow sublayers to center themselves 
    root.layoutManager = [CAConstraintLayoutManager layoutManager]; 

    // create a new layer which will contain ALL our sublayers 
    // ------------------------------------------------------- 
    mContainer  = [CALayer layer]; 
    mContainer.bounds = root.bounds; 
    mContainer.frame = root.frame; 
    mContainer.position = CGPointMake(root.bounds.size.width * 0.5, 
         root.bounds.size.height * 0.5); 

    // insert layer on the bottom of the stack so it is behind the controls 
    [root insertSublayer:mContainer atIndex:0]; 

    // make it resize when its superlayer does 
    root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 

    // make it resize when its superlayer does 
    mContainer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 
    } 

// ------------------------------------------------------------------------------------- 

- (void) loadMyImage:(NSString*) path 
      n:(NSInteger) num 
      x:(NSInteger) xpos 
      y:(NSInteger) ypos 
      h:(NSInteger) hgt 
      w:(NSInteger) wid 
      b:(NSString*) blendstr 
    { 
    #ifdef __DEBUG_LOGGING__ 
    NSLog(@"loadMyImage - ENTER [%@] num[%d] x[%d] y[%d] h[%d] w[%d] b[%@]", 
            path, num, xpos, ypos, hgt, wid, blendstr); 
    #endif 

    NSInteger xoffset = ((wid/2) + xpos); // use CORNER versus CENTER for location 
    NSInteger yoffset = ((hgt/2) + ypos); 
    CIFilter* filter = nil; 

    CGRect cgrect = CGRectMake((CGFloat) xoffset, (CGFloat) yoffset, 
            (CGFloat) wid, (CGFloat) hgt); 

    if(nil != blendstr) // would be equivalent to @"CIMultiplyBlendMode" or similar 
     { 
     filter = [CIFilter filterWithName:blendstr];  
     } 

     // read image file via supplied path 
    NSImage* theimage = [[NSImage alloc] initWithContentsOfFile:path]; 

    if(nil != theimage) 
     { 
     [self setMyImageLayer:[CALayer layer]]; // create layer 
     myImageLayer.frame = cgrect;   // locate & size image 
     myImageLayer.compositingFilter = filter; // nil is OK if no filter 
     [myImageLayer setContents:(id) theimage]; // deposit image into layer 
       // add new layer into our main layer [see awakeFromNib above] 
     [mContainer insertSublayer:myImageLayer atIndex:0]; 
     [theimage release]; 
     } 
    else 
     { 
     NSLog(@"ERROR loadMyImage - no such image [%@]", path); 
     } 
    } 
0
+ (CGImageRef) getCachedImage:(NSString *) imageName 
{ 
    NSGraphicsContext *context = [[NSGraphicsContext currentContext] graphicsPort]; 

    NSImage *img = [NSImage imageNamed:imageName]; 

    NSRect rect = NSMakeRect(0, 0, [img size].width, [img size].height); 
    return [img CGImageForProposedRect:&rect context:context hints:NULL]; 
} 


+ (CGImageRef) getImage:(NSString *) imageName withExtension:(NSString *) extension 
{ 
    NSGraphicsContext *context = [[NSGraphicsContext currentContext] graphicsPort]; 

    NSString* imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:extension]; 
    NSImage* img = [[NSImage alloc] initWithContentsOfFile:imagePath]; 

    NSRect rect = NSMakeRect(0, 0, [img size].width, [img size].height); 
    CGImageRef imgRef = [img CGImageForProposedRect:&rect context:context hints:NULL]; 

    [img release]; 

    return imgRef; 
} 

その後、あなたはそれを設定することができます。

yourLayer.contents =(ID)[自己getCachedImage: "myImage.png" @]を。

又は

yourLayer.contents =(ID)[自己のgetImage:@ "MYIMAGE" withExtension: "PNG" @]。

関連する問題