如何从一系列生成的图像创建Quicktime电影?

SSt*_*eve 5 macos cocoa qtkit objective-c

我需要从一系列生成的图像中创建一部电影.(我正在根据物理建模程序的输出创建图像.)

我在QtKitCreateMovie中找到了Apple的样本并将其作为起点.我没有从应用程序包中加载jpgs,而是绘制到NSImage,然后将NSImage添加到电影对象中.这是我用于测试的基本代码.mMovie是一个实例QTMovie:

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];
Run Code Online (Sandbox Code Playgroud)

这在OS X 10.5下工作,但在OS X 10.6下,我在调用时获得了超出边界异常的数组索引addImage:forDuration:withAttributes:(http://openradar.appspot.com/radar?id=1146401)

在10.6下制作电影的正确方法是什么?

此外,虽然这可以在10.5下工作,但如果我尝试创建一个包含数千帧的电影,我的内存就会耗尽.这也让我觉得我没有使用正确的方法.

Pet*_*sey 3

你做对了,但你做错了。

\n\n

QTKit 中正确的方法没有改变。您的错误是您试图在完成图像之前添加图像,这种情况在您解锁焦点时发生。由于您直到尝试添加图像(20 次)后才解锁焦点,因此您尝试添加未完成的图像(20 次),但这是行不通的。

\n\n

\xe2\x80\x9cout ofbounds\xe2\x80\x9d 异常是因为图像没有表示。QTMovie 似乎正在尝试循环遍历图像返回的数组以响应消息representations,但该数组为空,因为图像尚未完成。

\n\n

不知何故,你在 Leopard 中逃脱了这个错误(可能是因为 Snow Leopard 中的实现细节发生了变化),但我想说这同样是你的错误。

\n\n

解决方案很简单,每次循环时锁定焦点并解锁图像上的焦点:

\n\n
float blendValue;\nfor (blendValue = 0.0; blendValue <= 1.0; blendValue += 0.05) {\n    [anImage lockFocus];\n    [[NSGraphicsContext currentContext] setShouldAntialias:NO];\n    [[[NSColor blueColor] blendedColorWithFraction:blendValue ofColor:[NSColor redColor]] setFill];\n    [NSBezierPath fillRect:NSMakeRect(0, 0, frameSize, frameSize)];\n    [anImage unlockFocus];\n\n    [mMovie addImage:anImage forDuration:duration withAttributes:myDict];\n}\n
Run Code Online (Sandbox Code Playgroud)\n