2011-05-13 103 views
5

我需要從一系列生成的圖像中創建電影。 (我正在創建基於物理建模程序輸出的圖像)。如何從一系列生成的圖像創建Quicktime電影?

我在QtKitCreateMovie中找到Apple的樣本並將其用作起點。我不是從應用程序包加載jpgs,而是繪製到NSImage,然後將NSImage添加到電影對象。這是我用於測試的基本代碼。 mMovieQTMovie一個實例:

NSImage *anImage = [[NSImage alloc] initWithSize:NSMakeSize(frameSize, frameSize)]; 
[anImage lockFocus]; 

float blendValue; 
for (blendValue = 0.0; blendValue <= 1.0; blendValue += 0.05) { 
    [[[NSColor blueColor] blendedColorWithFraction:blendValue ofColor:[NSColor redColor]] setFill]; 
    [NSBezierPath fillRect:NSMakeRect(0, 0, frameSize, frameSize)]; 
    [mMovie addImage:anImage forDuration:duration withAttributes:myDict]; 
} 
[anImage unlockFocus]; 
[anImage release]; 

此作品在OS X 10.5,但在OS X 10.6,我得到一個數組索引超出邊界上的呼叫例外addImage:forDuration:withAttributes:(http://openradar.appspot.com/radar?id=1146401

什麼在10.6以下創建電影的正確方法?

此外,雖然這可以在10.5下工作,但如果我嘗試使用數千幀創建電影,則內存不足。這也讓我覺得我沒有使用正確的方法。

+1

你可以讓你的顏色填充使用'NSRectFill'功能,它使用'NSCompositeCopy快一點',而不是'+ [NSBezierPath fillRect:]',默認爲'NSCompositeSourceOver'。結果看起來沒有什麼不同(因爲你填充的所有顏色都有1.0 alpha),但是最後我檢查過的Copy的速度明顯更快。 – 2011-05-14 09:50:05

+0

另外,當沒有填充曲線路徑時,沒有太多理由來設置上下文是否應該消除鋸齒。 – 2011-05-14 10:12:06

+0

謝謝,彼得。我將我的調用從'+ [NSBezierPath fillRect:]'更改爲'NSRectFill'。在我的真實代碼中,我繪製了彎曲的路徑。 – SSteve 2011-05-14 15:41:32

回答

3

你做得對,但你做錯了。

正確的方式在QTKit中沒有改變。你的錯誤是,你正在試圖在完成之前添加圖像,這在解鎖焦點時發生。由於在嘗試添加圖像(20次)之後才能解鎖焦點,因此您正嘗試添加未完成的圖像(20次),但這種方式不起作用。

「越界」異常是因爲圖像沒有表示。 QTMovie似乎試圖循環顯示圖像返回的數組以響應representations消息,但該數組是空的,因爲圖像未完成。

不知何故,你在Leopard中逃脫了這種可能(可能是因爲Snow Leopard中的實現細節發生了變化),但我會說它已經不是你的缺陷了。

的解決方案是簡單地鎖定焦點,並通過循環圖像上每一次解鎖焦點:

float blendValue; 
for (blendValue = 0.0; blendValue <= 1.0; blendValue += 0.05) { 
    [anImage lockFocus]; 
    [[NSGraphicsContext currentContext] setShouldAntialias:NO]; 
    [[[NSColor blueColor] blendedColorWithFraction:blendValue ofColor:[NSColor redColor]] setFill]; 
    [NSBezierPath fillRect:NSMakeRect(0, 0, frameSize, frameSize)]; 
    [anImage unlockFocus]; 

    [mMovie addImage:anImage forDuration:duration withAttributes:myDict]; 
} 
+0

美麗。很棒! – SSteve 2011-05-14 15:25:06

相關問題