Как я могу показать изображение в 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.
Спасибо.
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);