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

时间:2011-05-13 22:32:22

标签: objective-c cocoa macos qtkit

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

我在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 个答案:

答案 0 :(得分: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];
}