无法从NSView制作PNG位图

时间:2010-11-26 11:50:46

标签: cocoa png nsview

更新
没关系:-)
使用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;
}

任何想法都将不胜感激!

2 个答案:

答案 0 :(得分:3)

结束使用bitmapImageRepForCachingDisplayInRect:&而是cacheDisplayInRect:toBitmapImageRep:

答案 1 :(得分:1)

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