How can I show an image in a NSView using an CGImageRef image

前提是你 提交于 2019-12-11 04:16:51

问题


I want to show an image in NSview or in the NSImageView. In my header file I have

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

here is what I been trying to do in my implementation file:

- (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);
}

I don't get anything in the NSview window when I run the script. No errors at all I just can't see what I'm doing wrong. My Xcode version in 5.1.1

I'm trying to learn how to manipulate CGImageRef and view it in a window or nsview.

Thank you.


回答1:


I'm not quite sure what exactly your setup is. Drawing an image in a custom view is a separate thing from using an NSImageView. Also, a custom view that may (or may not) be layer-backed is different from a layer-hosting view.

You have a lot of the right elements, but they're all mixed up together. In no case do you have to lock focus on an NSImage. That's for drawing into an NSImage. Also, a custom view that subclasses from NSView doesn't have to call super in its -drawRect:. NSView doesn't draw anything.

To draw an image in a custom view, try:

- (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);
}

If you have an NSImageView, then you don't need a custom view or any drawing method or code. Just do the following at the point where you obtain the image or the information necessary to generate it:

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

If you're working with a layer-hosting view, you just need to set the CGImage as the layer's content. Again, you do this whenever you obtain the image or the information necessary to generate it. It's not in -drawRect:.

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


来源:https://stackoverflow.com/questions/23790336/how-can-i-show-an-image-in-a-nsview-using-an-cgimageref-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!