我需要从一系列生成的图像中创建一部电影。(我正在根据物理建模程序的输出创建图像。
我在QtKitCreateMovie中找到了Apple的示例,并将其用作起点。我不是从应用程序包加载jpg,而是绘制到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];
这在OS X 10.5下有效,但在OS X 10.6下,我在调用addImage:forDuration:withAttributes
时得到一个超出边界的数组索引异常:(http://openradar.appspot.com/radar?id=1146401)
在 10.6 下制作电影的正确方法是什么?
此外,尽管这在 10.5 下有效,但如果我尝试创建具有数千帧的电影,我会耗尽内存。这也让我觉得我没有使用正确的方法。
你做对了,但你做错了。
正确的方式在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];
}