gpt4 book ai didi

cocoa - 将离线 NSView 捕获到 NSImage

转载 作者:行者123 更新时间:2023-12-03 17:41:12 36 4
gpt4 key购买 nike

我正在尝试制作一个自定义动画,以将 NSView 替换为另一个。因此,我需要在 NSView 出现在屏幕上之前获取它的图像。

View 可能包含图层和 NSOpenGLView subview ,因此像 initWithFocusedViewRectbitmapImageRepForCachingDisplayInRect 这样的标准选项在这种情况下不能很好地工作(它们在我的实验中,图层或 OpenGL 内容效果很好)。

我正在寻找像CGWindowListCreateImage这样的东西,它能够“捕获”离线NSWindow,包括图层和OpenGL内容。

有什么建议吗?

最佳答案

我为此创建了一个类别:

@implementation NSView (PecuniaAdditions)

/**
* Returns an offscreen view containing all visual elements of this view for printing,
* including CALayer content. Useful only for views that are layer-backed.
*/
- (NSView*)printViewForLayerBackedView;
{
NSRect bounds = self.bounds;
int bitmapBytesPerRow = 4 * bounds.size.width;

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
CGContextRef context = CGBitmapContextCreate (NULL,
bounds.size.width,
bounds.size.height,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);

if (context == NULL)
{
NSLog(@"getPrintViewForLayerBackedView: Failed to create context.");
return nil;
}

[[self layer] renderInContext: context];
CGImageRef img = CGBitmapContextCreateImage(context);
NSImage* image = [[NSImage alloc] initWithCGImage: img size: bounds.size];

NSImageView* canvas = [[NSImageView alloc] initWithFrame: bounds];
[canvas setImage: image];

CFRelease(img);
CFRelease(context);
return canvas;
}

@end

此代码主要用于打印包含分层 subview 的 NSView。也可能对你有帮助。

关于cocoa - 将离线 NSView 捕获到 NSImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760187/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com