Come posso ottenere i dati delle immagini da QTKit senza colore o correzione gamma in Snow Leopard?

StackOverflow https://stackoverflow.com/questions/2052504

  •  20-09-2019
  •  | 
  •  

Domanda

Dato che Snow Leopard, QTKit torna ora dati dell'immagine a colori corretti da funzioni come QTMovies frameImageAtTime: withAttributes: errore :. Dato un file AVI non compresso, gli stessi dati immagine viene visualizzata con i valori dei pixel più grandi in Snow Leopard vs Leopard.

Al momento sto usando frameImageAtTime per ottenere un NSImage, poi chiedere l'tiffRepresentation di quell'immagine. Dopo aver fatto questo, i valori dei pixel sono leggermente superiori in Snow Leopard.

Per 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 di colore corretto? Dovrei chiedere un CGImageRef, CIImage o CVPixelBufferRef invece? C'è un modo per disattivare la correzione del colore del tutto 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 'colore corretto non' spazio colore, ma i valori dei colori non sono esattamente la stessa di ciò che è memorizzato nei file non compresso AVI stiamo testando con. Anche questo è molto meno efficiente perché è la conversione da RGB -> "Device RGB" -.> RGB

Inoltre, sto lavorando in un'applicazione a 64 bit, in modo da far cadere verso il basso per l'API Quicktime-C non è un'opzione.

Grazie per il vostro aiuto.

È stato utile?

Soluzione

Questo è quello che si sta eseguendo contro: http://support.apple.com/kb/ ht3712 Anche qui descritta con riferimento alla QT: http://developer.apple. com / library / mac / # note tecniche / tn2227 / _index.html

Ci doveva essere una bandiera opt-out per ColorSync (che è automatico e silenzioso), ma perché ColorSync risale al "era Carbon-iferous" c'è un sacco di confusione su come disattivare da un 64- bit app. Può anche non esistere, e solo alcuna documentazione. Ma anche Adobe non ha capito quanto ne so (64 bit di Photoshop per OS X ???) [EDIT: In realtà, forse hanno fatto con CS5, o hanno trovato una soluzione ... quindi se avete degli amici che vi lavorano forse possono essere una risorsa;) Comunque, credo che anche i loro colori possono venire fuori diverso su 64 bit OS X vs Windows o 32 bit]

.

Il primo collegamento dice come per forzare un valore di gamma di 1,8 a livello di sistema e non a livello di codice. Basta segnalarlo -. Probabilmente è solo di uso limitato per la vostra applicazione, ma bene sapere

Il solito modo per disattivare ColorSync è / era

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

Ma io non so se che sta andando a lavorare in un'applicazione a 64 bit (abbastanza sicuro che non è così). In realtà, un sacco di cose relative alla ColorSync sono più difficili, forse non è ancora possibile, a 64-bit. Basta cercare. "Site: ColorSync apple.com 64 bit"

Se trovo qualcosa di meglio Io modificare la mia risposta. Proprio pensato che questo sarebbe aiuterà a conoscere il nemico, per così dire.

Un altro edit: (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 colore del video? Prova sRGB forse?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top