5

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

我在 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 下工作,但如果我尝试创建具有数千帧的电影,我会耗尽内存。这也让我觉得我没有使用正确的方法。

4

1 回答 1

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];
}
于 2011-05-14T10:11:21.263 回答