更新
没关系:-)
使用bitmapImageRepForCachingDisplayInRect
& cacheDisplayInRect:toBitmapImageRep:
。
不过,我会在这里留下问题作为后代。
我正在研究一个小应用程序,除其他外,它有一个NSView
子类,它绘制了一堆bezierPaths。我希望能够将绘制的结果保存为EPS或PNG。
视图正在屏幕外窗口中绘制(出于缩放原因),即使它返回正确的EPS数据,我似乎无法从中获取任何有用的位图数据。
EPS没问题(我只是将NSData
从-dataWithEPSInsideRect:
写到文件中),但我似乎无法获得PNG位图。
如果我试着打电话:
[self lockFocus];
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:self.bounds];
[self unlockFocus];
return rep;
从我添加到NSView的类别方法中,当我尝试representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]
时,我得到了无用的白色PNG数据。
奇怪的是,如果我尝试从外部视图(或其类别方法)调用lockFocus / initBitmapWith ../ unlockFocus,我会得到一个异常,说隐藏了视图或其中一个祖先。好吧,是的,它是屏幕外的(屏幕外窗口是初始化的延迟:不,顺便说一下,所以应该画画)。
所以我可以获得无用的数据,或者我可以获得异常。不太棒。
添加我的困惑:如果我制作一个包含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;
}
任何想法都将不胜感激!
答案 0 :(得分:3)
结束使用bitmapImageRepForCachingDisplayInRect:
&而是cacheDisplayInRect:toBitmapImageRep:
答案 1 :(得分:1)
我建议您创建一个NSImage,锁定焦点,告诉视图绘制边界,解锁焦点,然后ask the image to create a CGImage,然后将其传递给CGImageDestination以写出PNG数据/文件。