【问题标题】:Rendering NSView containing some CALayers to an NSImage将包含一些 CALayers 的 NSView 渲染到 NSImage
【发布时间】:2011-05-29 19:23:02
【问题描述】:

我有一个 NSView,它包含一个 NSScrollView,其中包含一个 CALayer 支持的 NSView。我已经尝试了所有将 NSView 捕获到 NSImage 中的常用方法(使用 -dataWithPDFInsideRect、NSBitmapImageRep 的 -initWithFocusedViewRect 等)但是,所有这些方法都将 CALayer 支持的 NSView 视为不存在。我已经看过this StackOverflow 的帖子,但这是一个关于将 CALayer 树渲染到图像的问题,而不是包含常规 NSView 和图层支持视图的 NSView。

感谢任何帮助,谢谢:)

【问题讨论】:

    标签: objective-c cocoa calayer nsview nsimage


    【解决方案1】:

    我发现这样做的唯一方法是使用 CGWindow API,例如:

    CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);
    

    然后用

    剪出与您的视图相对应的 CGImage 部分

    -imageByCroppingToRect。

    然后从裁剪的 CGImage 中制作一个 NSImage。 请注意,如果该窗口的某些部分不在屏幕上,这将无法正常工作。

    【讨论】:

    • 您可以使用 CGWindowListCreateImage 中的第一个参数来捕获特定的矩形,而不是事后进行裁剪。
    • @ev0 我试过了,但结果是一个空白图像。
    【解决方案2】:

    这可以将视图直接绘制到NSImage,尽管我还没有尝试使用图层支持的视图:

    NSImage * i = [[NSImage alloc] initWithSize:[view frame].size];
    [i lockFocus];
    if ([view lockFocusIfCanDrawInContext:[NSGraphicsContext currentContext]]) {
      [view displayRectIgnoringOpacity:[view frame] inContext:[NSGraphicsContext currentContext]];
      [view unlockFocus];
    }
    [i unlockFocus];
    
    NSData * d = [i TIFFRepresentation];
    [d writeToFile:@"/path/to/my/test.tiff" atomically:YES];
    [i release];
    

    【讨论】:

    • 警告一次:-[NSView lockFocusIfCanDrawInContext:] 已声明但尚未在此 AppKit 构建中实现。什么都没有发生
    【解决方案3】:

    你看过 Cocoa Drawing Guide 中的建议吗? ("Creating a Bitmap")

    要直接在位图中绘制,请使用您想要的参数创建一个新的 NSBitmapImageRep 对象,并使用 NSGraphicsContext 的 graphicsContextWithBitmapImageRep: 方法来创建绘图上下文。使新上下文成为当前上下文并绘制。此技术仅在 Mac OS X v10.4 及更高版本中可用。 或者,您可以创建一个 NSImage 对象(或屏幕外窗口),在其中绘制,然后捕获图像内容。所有版本的 Mac OS X 都支持这种技术。

    这听起来类似于我熟悉的 iOS 解决方案(使用 UIGraphicsBeginImageContext 和 UIGraphicsGetImageFromCurrentImageContext),所以我希望它适用于您的视图。

    【讨论】:

      【解决方案4】:

      请看这篇帖子的答案:How do I render a view which contains Core Animation layers to a bitmap?

      在与您类似的情况下,这种方法对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多