2010-01-12 8 views
8

Dopo Snow Leopard, QTKit sta ora restituendo i dati dell'immagine corretti per il colore da funzioni come QTMovies frameImageAtTime: withAttributes: error :. Dato un file AVI non compresso, gli stessi dati dell'immagine vengono visualizzati con valori di pixel più grandi in Snow Leopard vs Leopard.Come posso ottenere i dati delle immagini da QTKit senza correzione colore o gamma in Snow Leopard?

Attualmente sto usando frameImageAtTime per ottenere un NSImage, quindi chiedo la rappresentazione tiff di quella immagine. Dopo averlo fatto, i valori dei pixel sono leggermente più alti in Snow Leopard.

Ad esempio, un file con il seguente valore del pixel in Leopard:

[0 180 0] 

ora ha un valore di pixel come:

[0 192 0] 

C'è un modo per chiedere un QTMovie per fotogrammi video che non sono corretti i colori? Dovrei chiedere invece un CGImageRef, CIImage o CVPixelBufferRef? C'è un modo per disabilitare completamente la correzione del colore prima di leggere nei file video?

ho tentato di risolvere questo problema da disegno in un NSBitmapImageRep con la NSCalibratedColroSpace, ma che ottiene solo una parte del tragitto mia:

// Create a movie 
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys : 
         nsFileName, QTMovieFileNameAttribute, 
         [NSNumber numberWithBool:NO], QTMovieOpenAsyncOKAttribute, 
         [NSNumber numberWithBool:NO], QTMovieLoopsAttribute, 
         [NSNumber numberWithBool:NO], QTMovieLoopsBackAndForthAttribute, 
         (id)nil]; 
_theMovie = [[QTMovie alloc] initWithAttributes:dict error:&error]; 


// ....  

NSMutableDictionary *imageAttributes = [NSMutableDictionary dictionary]; 
[imageAttributes setObject:QTMovieFrameImageTypeNSImage forKey:QTMovieFrameImageType]; 
[imageAttributes setObject:[NSArray arrayWithObject:@"NSBitmapImageRep"] forKey: QTMovieFrameImageRepresentationsType]; 
[imageAttributes setObject:[NSNumber numberWithBool:YES] forKey:QTMovieFrameImageHighQuality]; 

NSError* err = nil; 
NSImage* image = (NSImage*)[_theMovie frameImageAtTime:frameTime withAttributes:imageAttributes error:&err]; 


// copy NSImage into an NSBitmapImageRep (Objective-C) 
NSBitmapImageRep* bitmap = [[image representations] objectAtIndex:0]; 

// Draw into a colorspace we know about 
NSBitmapImageRep *bitmapWhoseFormatIKnow = [[NSBitmapImageRep alloc] 
               initWithBitmapDataPlanes:NULL 
               pixelsWide:getWidth() 
               pixelsHigh:getHeight() 
               bitsPerSample:8 
               samplesPerPixel:4 
               hasAlpha:YES 
               isPlanar:NO 
               colorSpaceName:NSCalibratedRGBColorSpace 
               bitmapFormat:0 
               bytesPerRow:(getWidth() * 4) 
               bitsPerPixel:32]; 
[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapWhoseFormatIKnow]]; 
[bitmap draw]; 
[NSGraphicsContext restoreGraphicsState]; 

Questo si converte di nuovo ad un 'non colore corretto 'colorspace, ma i valori dei colori NOT sono esattamente uguali a quelli memorizzati nei file AVI non compressi con i quali stiamo testando. Anche questo è molto meno efficiente perché sta convertendo da RGB -> "Dispositivo RGB" -> RGB.

Inoltre, sto lavorando a un'applicazione a 64 bit, quindi scendere all'API Quicktime-C non è un'opzione.

Grazie per il vostro aiuto.

+0

Qual è la destinazione dei pixel nella bitmap? Che tipo di spazio colore si ottiene da [spazio colori bitmap]? –

risposta

2

Questo è ciò che si sta eseguendo contro: http://support.apple.com/kb/ht3712 Anche qui descritta in riferimento a QT: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

Ci doveva essere una bandiera opt-out per ColorSync (che è automatico e silenzioso), ma Poiché ColorSync ritorna all'era "Carbon-iferous" c'è molta confusione su come disabilitarlo da un'app 64-bit. Potrebbe persino esistere e non avere documentazione. Ma anche Adobe non ha capito AFAIK (Photoshop 64 bit per OS X ???) [EDIT: In realtà, forse hanno fatto con CS5, o trovato una soluzione ... quindi se avete amici che ci lavorano forse possono essere una risorsa;) Tuttavia, penso che persino i loro colori possano apparire diversi su OS X a 64 bit o Windows o 32 bit].

Il primo collegamento indica come forzare un valore gamma di 1,8 a livello di sistema e non a livello di programmazione. Basta indicarlo - probabilmente è solo di uso limitato per la tua applicazione, ma buono a sapersi.

Il solito modo per disattivare ColorSync è/era

GraphicsImportSetFlags(gi, kGraphicsImporterDontUseColorMatching); 

Ma non so se questo è di andare a lavorare in un'applicazione a 64 bit (abbastanza sicuro che non è così). In effetti, molte cose relative a ColorSync sono più difficili, forse non ancora possibili, a 64-bit. Basta cercare "site: apple.com colorsync 64 bit".

Se trovo qualcosa di meglio, modifico la mia risposta. Ho pensato che questo ti avrebbe aiutato a conoscere il nemico, per così dire.

Un'altra modifica: (Re) Tagging tuoi video potrebbero attenuare o eliminare questo problema, in quanto anche ColorSync considera video senza tag in un certo modo (vedi link) e opera su di loro in modo diverso a seconda delle tag. Qual è il profilo cromatico dei video? Prova sRGB forse?