【问题标题】:Draw a NSImage using cocoa使用可可绘制 NSImage
【发布时间】:2013-04-02 16:59:49
【问题描述】:

目前我正在使用 NSView 上的贝塞尔路径绘制一些形状。绘图代码在 drawRect: 方法上执行并最终创建图像。

我不想在任何地方向用户显示此视图。然而,据我所知,drawRect: 方法只有在我们将视图添加到超级视图并随后在 NSView 上调用 display 或 displayNeedsUpdate 方法时才会被调用。

我的要求是创建所需绘图的图像。

除了绘制到 NSView 并将其转换为 PNG 之外,有什么方法可以直接绘制图像吗?

【问题讨论】:

    标签: objective-c macos cocoa core-graphics nsview


    【解决方案1】:

    您必须通过指定视图框架来创建NSBitmapImageRep 并使用bitmapImageRepForCachingDisplayInRect:

    将绘制位图图像表示。

    然后,您只需使用representationUsingType:NSPNGFileType properties:nil 并将结果写入文件即可。

    以下示例摘自cocoa with love的教程:Advanced drawing using AppKit

    NSRect iconViewFrame = iconView.frame;
    [iconView setFrame:[iconView nativeRect]];
    
    NSBitmapImageRep *bitmapImageRep =
        [iconView bitmapImageRepForCachingDisplayInRect:[iconView frame]];
    [iconView
        cacheDisplayInRect:[iconView bounds]
        toBitmapImageRep:bitmapImageRep];
    [[bitmapImageRep representationUsingType:NSPNGFileType properties:nil]
        writeToURL:[savePanel URL]
        atomically:YES];
    
    [iconView setFrame:iconViewFrame];
    

    他们还建议:

    创建自己的 NSBitmapImageRep,设置 NSGraphicsContext 使用 graphicsContextWithBitmapImageRep:,自己锁定焦点并 直接调用 drawRect: 会避免这些问题,而且更多 灵活的。但这本来可以做更多的工作,所以我没有为此烦恼 示例项目(我主要将此导出代码放入应用程序中,这样我就可以 创建应用程序的图标)。

    因此您可以选择最适合您需求的解决方案。

    【讨论】:

    • 如果我错了,请纠正我,这段代码 sn-p 所做的是将 NSView 转换为 PNG,不是吗?要创建绘图,仍然应该执行 -drawRect 方法不是吗?
    • 这是标准方式。但是视图不需要以这种方式显示。您只需创建视图而不显示它。通常人们在需要打印视图的特定部分时也会这样做。
    • 非常感谢您的快速回复
    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多