【问题标题】:Having trouble making a PNG bitmap from an NSView从 NSView 制作 PNG 位图时遇到问题
【发布时间】:2011-09-01 00:35:21
【问题描述】:

更新
没关系:-)
使用bitmapImageRepForCachingDisplayInRectcacheDisplayInRect:toBitmapImageRep: 解决了这个问题。
不过,我会把这个问题留给后代。


我正在开发一个小应用程序,除其他外,它有一个 NSView 子类,它绘制了一堆 bezierPaths。我希望能够将绘制的结果保存为 EPS 或 PNG。

视图正在屏幕外窗口中绘制(出于缩放原因),即使它返回正确的 EPS 数据,我似乎也无法从中获得任何有用的位图数据。

EPS 没问题(我只是将-dataWithEPSInsideRect: 中的NSData 写入文件),但我似乎无法获得PNG 位图。

如果我尝试打电话:

[self lockFocus];
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:self.bounds];
[self unlockFocus];
return rep;

从我添加到 NSView 的类别方法中,当我尝试 representationUsingType:NSPNGFileType properties:[NSDictionary dictionary] 时,我得到了无用的白色 PNG 数据。

奇怪的是,如果我尝试从视图(或其类别方法)外部调用 lockFocus/initBitmapWith../unlockFocus,我会收到一个异常,指出视图或其祖先之一被隐藏。嗯,是的,它在屏幕外(屏幕外窗口是用 defer:NO 初始化的,顺便说一下,所以它应该绘制)。

所以我要么得到无用的数据,要么得到一个异常。不太好。

增加我的困惑:如果我制作一个包含 EPS 表示的 NSImage 和一个(无用的)白色位图,两者都应该是视图边界的大小,则位图表示总是比 20 像素/单位窄界限。不知道为什么! EPS 尺寸正确。

由于这可能都与屏幕外窗口的创建方式有关,这里是它的代码(来自 NSView 类别)

- (NSWindow*)placeInOffscreenWindow {
NSRect windowBounds = { { -1000.0 , -1000.0 } , self.bounds.size };
NSWindow *hiddenWindow = [[NSWindow alloc] initWithContentRect: windowBounds
                                                         styleMask: NSTitledWindowMask | NSClosableWindowMask
                                                           backing: NSBackingStoreNonretained
                                                             defer: NO];

[[hiddenWindow contentView] addSubview:self];
return hiddenWindow;
}

任何想法都将不胜感激!

【问题讨论】:

    标签: cocoa png nsview


    【解决方案1】:

    最终改用bitmapImageRepForCachingDisplayInRect: & cacheDisplayInRect:toBitmapImageRep:

    【讨论】:

    【解决方案2】:

    我建议你创建一个 NSImage,锁定焦点,告诉视图绘制边界,然后解锁焦点,然后 ask the image to create a CGImage,然后将其传递给 CGImageDestination 以写出 PNG 数据/文件。

    【讨论】:

    • @Hosey:感谢您的提示,但我实际上最终使用了 bitmapImageRepForCachingDisplayInRect: & cacheDisplayInRect:toBitmapImageRep: ,这似乎工作正常。但我可能也会尝试你的建议,只是为了学习一些东西。顺便说一句,我正在使用 Rentzsch 制作的脚本来启用您建议的警告 - 谢谢! “Hardass 模式”给了我很多重构的想法,所以现在好多了!另外,由于我只是从 Obj-C/Cocoa 开始,这对我很有帮助!
    • 我发现 CGImageDestination 比 NSBitmapImageRep 的 representationUsingType:properties: 方法更可靠,但它们应该同样出色地完成这项工作。至于警告帖子:不客气。 ☺
    • @Hosey:很有趣。感谢内幕消息:)
    猜你喜欢
    • 2013-08-02
    • 2013-05-02
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多