Начиная с Snow Leopard, QTKit теперь возвращает данные изображения с коррекцией цвета из таких функций, как QTMovies frameImageAtTime: withAttributes: error :. Для несжатого файла AVI те же данные изображения отображаются с большими значениями пикселей в Snow Leopard vs. 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 -> «Device RGB» -> RGB.
Кроме того, я работаю в 64-битном приложении, поэтому переход на Quicktime-C API не вариант.
Спасибо за вашу помощь.