2011-05-13 99 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

相关问题