2011-05-13 8 views
5

Necesito crear una película a partir de una serie de imágenes generadas. (Estoy creando las imágenes basadas en la salida de un programa de modelado de física.)¿Cómo puedo crear una película de Quicktime a partir de una serie de imágenes generadas?

Encontré la muestra de Apple en QtKitCreateMovie y la usé como punto de partida. En lugar de cargar jpgs desde el paquete de aplicaciones, dibujo un NSImage y luego agrego ese NSImage al objeto de película. Aquí está el código básico que usé para probar. mMovie es una instancia de 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]; 

Esto funciona en OS X 10.5, pero en OS X 10.6 puedo obtener un índice gama allá de los límites excepción de la llamada a addImage:forDuration:withAttributes: (http://openradar.appspot.com/radar?id=1146401)

Lo que es la forma correcta de crear una película en 10.6?

Además, aunque esto funciona por debajo de 10.5, me quedo sin memoria si intento crear una película con miles de fotogramas. Eso también me hace pensar que no estoy usando el enfoque correcto.

+1

Puede hacer que su color se llena un poco más rápido mediante el uso de la función 'NSRectFill', que utiliza' NSCompositeCopy ', en lugar de' + [NSBezierPath fillRect:] ', que por defecto es' NSCompositeSourceOver'. El resultado no se verá diferente (dado que todos los colores con los que se llena tienen 1.0 alfa), pero Copiar, la última vez que lo marqué, fue considerablemente más rápido. –

+0

Además, no hay muchas razones para establecer si el contexto debe ser anti-alias cuando no se está rellenando una ruta curva. –

+0

Gracias, Peter. Cambié mis llamadas de '+ [NSBezierPath fillRect:]' a 'NSRectFill'. En mi código real, estoy dibujando caminos curvos. – SSteve

Respuesta

3

Lo estás haciendo bien, pero lo estás haciendo mal.

La forma correcta no ha cambiado en QTKit. Tu error es que estás tratando de agregar la imagen antes de que la hayas terminado, lo que sucede cuando desbloqueas el foco. Como no se desbloquea el foco hasta después de intentar agregar la imagen (20 veces), está tratando de agregar una imagen sin terminar (20 veces), lo que no funciona.

La excepción "fuera de límites" se debe a que la imagen no tiene representaciones. QTMovie, al parecer, está intentando recorrer la matriz devuelta por la imagen en respuesta a un mensaje representations, pero esa matriz está vacía porque la imagen no está terminada.

De alguna manera, te saliste con esto en Leopard (probablemente debido a un detalle de implementación que cambió en Snow Leopard), pero yo diría que no fue menos tu error entonces.

La solución es simplemente para bloquear el enfoque y desbloquear el foco en la imagen cada vez a través del bucle:

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]; 
} 
+0

Hermoso. ¡Funciona genial! – SSteve

Cuestiones relacionadas