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];

これはOSX10.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 に答える