2011-05-13 24 views
5

Bir dizi oluşturulmuş görüntüden bir film oluşturmam gerekiyor. (Görüntüleri bir fizik modelleme programının çıktısını temel alarak oluşturuyorum.)Bir dizi oluşturulan görüntüden bir Quicktime filmi nasıl oluşturabilirim?

Apple'ın QtKitCreateMovie örneğini buldum ve bunu bir başlangıç ​​noktası olarak kullandım. Uygulama paketinden jpgs yüklemek yerine, bir NSImage'a çiziyorum ve sonra bu NSImage'ı film nesnesine ekliyorum. İşte test için kullandığım temel kod. mMovieQTMovie bir örneğidir:

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

Bu OS X 10.5 altında çalışır, ancak OS X 10.6 altında ben addImage:forDuration:withAttributes için sınırlarının ötesinde bir dizi indeksi çağrı istisna olsun: (http://openradar.appspot.com/radar?id=1146401)

neler var 10.6'nın altında bir film oluşturmanın uygun yolu?

Ayrıca, bu, 10.5'in altında çalışmasına rağmen, binlerce kareye sahip bir film oluşturmaya çalışırsam bellek dolduğumda. Bu da bana doğru yaklaşımı kullanmadığımı düşünmemi sağlıyor.

+1

'' [NSBezierPath fillRect:] 'yerine,' NSCompositeSourceOver' için varsayılan değerdir. Sonuç farklı görünmeyecektir (doldurduğunuz tüm renkler 1.0 alfa olduğundan), ancak son kontrol ettiğim Kopya, ölçülebilir şekilde daha hızlıdır. –

+0

Ayrıca, kıvrımlı bir yolu doldurmadığınızda içeriğin kenar yumuşatması gerekip gerekmediğini belirlemenin pek bir nedeni yok. –

+0

Teşekkürler, Peter. Aramalarımı + [NSBezierPath fillRect:] 'den' NSRectFill 'olarak değiştirdim. Gerçek kodumda kavisli yollar çiziyorum. – SSteve

cevap

3

Doğru yapıyorsunuz, ancak yanlış yapıyorsunuz.

QTKit'te doğru yol değişmedi. Hatanız, görüntüyü tamamlamadan önce eklemeyi denediğinizdir, bu, odağı açtığınızda gerçekleşir. Görüntüyü eklemeyi denedikten sonraya kadar odağın kilidini açmazsanız (20 kez), bitmeyen bir resim (20 kez) eklemeyi deniyorsunuz, bu da işe yaramıyor.

“Sınırların dışında” özel durumunun nedeni, görüntünün hiçbir temsilinin olmamasıdır. QTMovie, göründüğü gibi, bir representations iletisine yanıt olarak görüntü tarafından döndürülen dizinin içinden geçmeye çalışıyor, ancak görüntü bitmediği için bu dizi boş. Bir şekilde Leopard'da (muhtemelen Snow Leopard'da değişen bir uygulama detayından dolayı) kurtuldunuz, ama o zaman sizin hatalarınızdan daha az olmadığını söyleyebilirim.

çözüm odağı kilitlemek ve döngü yoluyla görüntü üzerinde her zaman odak kilidini basitçe:

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]; 
} 
Sen renk biraz daha hızlı `NSCompositeCopy kullanır` NSRectFill` fonksiyonunu kullanarak doldurur yapabilirsiniz
+0

Güzel. Harika çalışıyor! – SSteve

İlgili konular