如何使用CGImageRef图像在NSView中显示图像

时间:2014-05-21 17:43:08

标签: xcode nsview cgimageref

我想在NSview或NSImageView中显示图像。在我的头文件中,我有

@interface FVView : NSView
{
    NSImageView *imageView;
}
@end

这是我在实现文件中尝试做的事情:

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    (Here I get an image called fitsImage........ then I do)

    //Here I make the image
    CGImageRef cgImage = CGImageRetain([fitsImage CGImageScaledToSize:maxSize]);

    NSImage *imageR = [self imageFromCGImageRef:cgImage];
    [imageR lockFocus];

    //Here I have the view context
    CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];

    //Here I set the via dimensions
    CGRect renderRect = CGRectMake(0., 0., maxSize.width, maxSize.height);

    [self.layer renderInContext:ctx];
    [imageR unlockFocus];

    CGContextDrawImage(ctx, renderRect, cgImage);
    CGImageRelease(cgImage);
}

运行脚本时,我在NSview窗口中没有得到任何内容。没有任何错误,我只能看不出我做错了什么。我在5.1.1中的Xcode版本

我试图学习如何操作CGImageRef并在窗口或nsview中查看它。

谢谢。

1 个答案:

答案 0 :(得分:2)

我不太清楚你的设置到底是什么。在自定义视图中绘制图像与使用NSImageView是分开的。此外,可能(或可能不)是图层支持的自定义视图与图层托管视图不同。

你有很多正确的元素,但它们都混在了一起。在任何情况下,您都不必将注意力锁定在NSImage上。这是为了将绘制成 NSImage。此外,来自NSView的子类的自定义视图不必在其super中调用-drawRect:NSView没有画任何东西。

要在自定义视图中绘制图像,请尝试:

- (void) drawRect:(NSRect)dirtyRect
{
    CGImageRef cgImage = /* ... */;
    NSSize maxSize = /* ... */;
    CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
    CGRect renderRect = CGRectMake(0., 0., maxSize.width, maxSize.height);
    CGContextDrawImage(ctx, renderRect, cgImage);
    CGImageRelease(cgImage);
}

如果您有NSImageView,那么您不需要自定义视图或任何绘图方法或代码。只需在获取图像或生成图像所需信息的位置执行以下操作:

NSImageView* imageView = /* ... */; // Often an outlet to a view in a NIB rather than a local variable.
CGImageRef cgImage = /* ... */;
NSImage* image = [[NSImage alloc] initWithCGImage:cgImage size:/* ... */];
imageView.image = image;
CGImageRelease(cgImage);

如果您正在使用图层托管视图,则只需将CGImage设置为图层的内容即可。同样,只要获得生成图像所需的图像或信息,就可以执行此操作。它不在-drawRect:

CALayer* layer = /* ... */; // Perhaps someView.layer
CGImageRef cgImage = /* ... */;
layer.contents = (__bridge id)cgImage;
CGImageRelease(cgImage);