2010-11-26 66 views
0

更新
沒關係製作PNG位圖:-)
想通了使用bitmapImageRepForCachingDisplayInRect & cacheDisplayInRect:toBitmapImageRep:
不過,我會留下這個問題留給後人。遇到麻煩的一個NSView


我工作的一個小應用程序,除其他事項外,有一個NSView子,吸引了一堆bezierPaths的。我希望能夠將繪製的結果保存爲EPS或PNG。

該視圖正在屏幕外的窗口中繪製(出於縮放的原因),並且即使它返回了正確的EPS數據,我似乎也無法從中獲取任何有用的位圖數據。

EPS是沒有問題的(我只是把NSData-dataWithEPSInsideRect:寫到一個文件中),但我似乎無法得到一個PNG位圖。

如果我嘗試調用:

[self lockFocus]; 
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:self.bounds]; 
[self unlockFocus]; 
return rep; 
從一個類中的方法,我加入的NSView

,我得到無用的白色PNG數據出來的時候我嘗試representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]

奇怪的是,如果我嘗試打電話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

結束了使用bitmapImageRepForCachingDisplayInRect: & cacheDisplayInRect:toBitmapImageRep:代替

1

我建議你創建一個NSImage,鎖定它的焦點,告訴視圖繪製其邊界,並解鎖焦點,然後ask the image to create a CGImage,然後將其傳遞給CGImageDestination以寫出PNG數據/文件。

+0

@Hosey:謝謝你的提示,但其實我結束了使用bitmapImageRepForCachingDisplayInRect:cacheDisplayInRect:toBitmapImageRep:相反,這似乎很好地工作。但我可能會嘗試一下你的建議,只是爲了學習一些東西。順便說一下,我使用的腳本Rentzsch使您的建議警告 - 謝謝! 「Hardass模式」爲我提供了大量的重構思路,所以它現在好多了!另外,因爲我只是從Obj-C/Cocoa開始,這是一個很大的幫助! – Flambino 2010-11-27 03:16:09

+0

我發現CGImageDestination比NSBitmapImageRep的`representationUsingType:properties:`方法更可靠,但它們*應該*同樣做得很好。至於警告帖子:不客氣。 ☺ – 2010-11-27 04:26:51