Как я могу получить данные изображения от QTKit без коррекции цвета или гамма-коррекции в Snow Leopard?

Начиная с Snow Leopard теперь возвращается QTKit, цвет исправил данные изображения от функций как QTMovies frameImageAtTime:withAttributes:error:. Учитывая несжатый файл AVI, те же данные изображения отображены с большими пиксельными значениями в Snow Leopard по сравнению с Leopard.

В настоящее время я использую frameImageAtTime, чтобы получить NSImage, затем попросить tiffRepresentation того изображения. После выполнения этого пиксельные значения немного выше в Snow Leopard.

Например, файл со следующим пиксельным значением в Leopard:

[0 180 0]

Теперь имеет пиксельное значение как:

[0 192 0]

Там какой-либо путь состоит в том, чтобы попросить у QTMovie видеокадров, которые не являются исправленным цветом? Я должен просить CGImageRef, CIImage или CVPixelBufferRef вместо этого? Существует ли способ отключить коррекцию цвета в целом до чтения в видеофайлах?

Я попытался работать вокруг этой проблемы путем вовлечения NSBitmapImageRep с NSCalibratedColroSpace, но который только получает мою часть пути там:

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

Это преобразовывает назад в 'Не цвет, исправленный' цветовое пространство, но значения цвета НЕ являются точно тем же как, что хранится в Несжатых файлах AVI, с которыми мы тестируем. Также это намного менее эффективно, потому что это преобразовывает из RGB-> "Устройство RGB"-> RGB.

Кроме того, я работаю в 64-разрядном приложении, таким образом раскрытие к API Quicktime-C не является опцией.

Спасибо за помощь.

8
задан Jon Seigel 4 April 2010 в 07:27
поделиться