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.
Qual è la destinazione dei pixel nella bitmap? Che tipo di spazio colore si ottiene da [spazio colori bitmap]? –