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

Начиная с 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 не вариант.

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


person Nick Haddad    schedule 12.01.2010    source источник
comment
Каково назначение пикселей в вашем растровом изображении? Какое цветовое пространство вы получаете от [цветовое пространство растрового изображения]?   -  person alex strange    schedule 03.01.2012


Ответы (1)


Вот с чем вы столкнулись: http://support.apple.com/kb/ht3712 Также описано здесь со ссылкой на QT: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

Предполагается, что для ColorSync должен быть флаг отказа (который является автоматическим и бесшумным), но поскольку ColorSync восходит к «углеродной эпохе», существует большая путаница относительно того, как отключить его в 64-битном приложении. Он может даже существовать и просто не иметь документации. Но даже Adobe не поняла это AFAIK (64-битный Photoshop для OS X ???) [РЕДАКТИРОВАТЬ: На самом деле, возможно, они сделали с CS5 или нашли обходной путь ... так что, если у вас есть друзья, которые там работают, возможно, они могут быть ресурсом;) Однако я думаю, что даже их цвета могут отличаться в 64-битной OS X от Windows или 32-битной].

Первая ссылка рассказывает, как принудительно установить значение гаммы 1,8 для всей системы и не программно. Просто укажите на это - вероятно, это только ограниченное использование для вашего приложения, но полезно знать.

Обычный способ отключить цветовую синхронизацию:

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

Но я не знаю, будет ли это работать в 64-битном приложении (почти уверен, что это не так). На самом деле, многие вещи, связанные с ColorSync, сложнее, а может быть, и невозможны в 64-битной версии. Просто выполните поиск "site: apple.com colorsync 64 bit".

Если найду что-нибудь получше, отредактирую свой ответ. Просто подумал, что это поможет тебе, так сказать, узнать врага.

Другое редактирование: (Re) Добавление тегов к вашим видео также может смягчить или устранить эту проблему, поскольку ColorSync обрабатывает немаркированные видео определенным образом (см. Ссылки) и работает с ними по-разному в зависимости от тегов. Какой цветовой профиль у видео? Может быть, попробовать sRGB?

person Rab    schedule 04.01.2012