Как я могу показать изображение в 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, когда запускаю скрипт. Никаких ошибок, я просто не вижу, что я делаю неправильно. Моя версия Xcode в 5.1.1

Я пытаюсь научиться манипулировать CGImageRef и просматривать его в окне или nsview.

Спасибо.


person joseamck    schedule 21.05.2014    source источник


Ответы (1)


Я не совсем уверен, что именно у вас за установка. Рисование изображения в пользовательском представлении — это отдельная вещь от использования 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);
person Ken Thomases    schedule 21.05.2014