从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。

谢谢你的帮助。

最佳答案

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

对于ColorSync,应该有一个退出标记(自动且无提示),但是由于ColorSync可以追溯到“碳时代”,因此对于如何从64位应用程序禁用它有很多困惑。它甚至可能存在,并且没有文档。但是,甚至Adobe都没有弄清楚AFAIK(用于OS X的64位Photoshop吗???)[编辑:实际上,也许他们是使用CS5的,或者找到了解决方法...所以,如果您有在那里工作的朋友,也许他们可以是一种资源;)但是,我认为即使它们的颜色在64位OS X与Windows或32位上也可能有所不同。

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

禁用colorsync的通常方法是

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching );


但是我不知道这是否可以在64位应用程序中正常工作(肯定不会)。实际上,与ColorSync相关的许多事情在64位环境中更加困难,甚至可能还不可能。只需搜索“ site:apple.com colorsync 64位”。

如果我发现更好的东西,我将编辑答案。可以这么说,只是以为这会帮助您认识敌人。

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

07-24 09:20