【发布时间】:2011-09-01 00:35:21
【问题描述】:
更新
没关系:-)
使用bitmapImageRepForCachingDisplayInRect 和cacheDisplayInRect: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;
}
任何想法都将不胜感激!
【问题讨论】: