首页 文章

无法从NSView制作PNG位图

提问于
浏览
0

Update
没关系 :-)
使用 bitmapImageRepForCachingDisplayInRectcacheDisplayInRect: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 回答

  • 3

    使用 bitmapImageRepForCachingDisplayInRect:cacheDisplayInRect:toBitmapImageRep: 结束

  • 1

    我建议你创建一个NSImage,锁定焦点,告诉视图绘制它的边界,然后解锁焦点,然后将其传递给CGImageDestination以写出PNG数据/文件 .

相关问题