如何在没有雪豹的颜色或伽马校正的情况下从QTKit获取图像数据?

时间:2010-01-12 21:25:53

标签: quicktime qtkit gamma

自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吗?有没有办法在读取视频文件之前完全禁用颜色校正?

我试图通过使用NSCalibratedColroSpace绘制到NSBitmapImageRep来解决此问题,但这只能让我在那里:

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

这确实会转换回“非颜色校正”颜色空间,但颜色值NOT与我们正在测试的未压缩AVI文件中存储的颜色值完全相同。这也是效率低得多,因为它是从RGB转换 - > “设备RGB” - > RGB。

此外,我正在使用64位应用程序,因此不能选择使用Quicktime-C API。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这就是你正在遇到的问题:http://support.apple.com/kb/ht3712 此处还参考QT进行了描述:http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

ColorSync应该有一个选择退出标志(自动和静音),但是因为ColorSync回到了“Carbon-iferous时代”,所以有很多关于如何从64-禁用它的混乱位应用。它甚至可能存在,而且没有文档。但即便是Adobe也没有想出它AFAIK(64位Photoshop for OS X ???)[编辑:实际上,也许他们使用CS5,或者找到了解决方法......所以如果你有任何朋友在那里工作也许他们可以是一种资源;)但是,我认为即使它们的颜色在64位OS X与Windows或32位上可能会有所不同。

第一个链接说明了如何在系统范围内以非编程方式强制实施1.8的伽玛值。只是指出它 - 它可能仅限于您的应用程序,但很高兴知道。

禁用colorsync的常用方法是/是

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

但我不知道这是否适用于64位应用程序(非常确定它不会)。事实上,很多与ColorSync相关的东西在64位中更难,也许还不可能。只需搜索“site:apple.com colorsync 64 bit”。

如果我找到更好的东西,我会编辑我的答案。只是想到这会帮助你了解敌人,可以这么说。

另一个编辑:(重新)标记您的视频可能会缓解或消除此问题,因为ColorSync以某种方式处理未标记的视频(请参阅链接),并根据标记对它们进行不同的操作。视频的颜色配置文件是什么?试试sRGB吧?