Как я могу создать фильм Quicktime из серии сгенерированных изображений? - PullRequest
5 голосов
/ 14 мая 2011

Мне нужно создать фильм из серии сгенерированных изображений. (Я создаю изображения на основе результатов программы физического моделирования.)

Я нашел образец Apple в QtKitCreateMovie и использовал его в качестве отправной точки. Вместо того, чтобы загружать 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];

Это работает в OS X 10.5, но в OS X 10.6 я получаю индекс массива за пределами исключение при вызове addImage:forDuration:withAttributes: (http://openradar.appspot.com/radar?id=1146401)

Как правильно создать фильм под 10,6?

Кроме того, хотя это работает и в 10.5, у меня заканчивается память, если я пытаюсь создать фильм с тысячами кадров. Это также заставляет меня думать, что я не использую правильный подход.

1 Ответ

3 голосов
/ 14 мая 2011

Вы делаете это правильно, но вы делаете это неправильно.

Правильный путь не изменился в 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];
}
...