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

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

  •  20-09-2019
  •  | 
  •  

Вопрос

Со времен Snow Leopard, Qtkit теперь возвращает данные изображения, скорректированные по цвету из таких функций, как Qtmovies frameimageattime: withattributes: error:. Учитывая несжатый файл AVI, те же данные изображения отображаются с большими значениями пикселей в снежном леопарде против леопарда.

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

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

[0 180 0]

Теперь есть значение пикселя, подобное:

[0 192 0]

Есть ли способ спросить QTMovie для видео кадров, которые не исправлены цветом? Должен ли я попросить вместо этого CGIMAGEREF, CIIMAGE или CVPIXELBUFFERREF? Есть ли способ вообще отключить коррекцию цвета до чтения в видеофайлах?

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

// 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 не является вариантом.

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

Это было полезно?

Решение

Это то, с чем вы сталкиваетесь: 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-битном. Просто поиск "Сайт: Apple.com Colorsync 64 Bit".

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

Другое редактирование: (re) помечение ваших видео может смягчить или устранить эту проблему, поскольку Colorsync обращается к негренным видео с определенным образом (см. Ссылки) и действует по -разному в зависимости от тегов. Какой цветовой профиль видео? Попробуйте Srgb, может быть?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top