8

自 Snow Leopard 以来,QTKit 现在从 QTMovies frameImageAtTime:withAttributes:error: 等函数返回颜色校正图像数据。给定一个未压缩的 AVI 文件,相同的图像数据在 Snow Leopard 与 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];

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

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

谢谢你的帮助。

4

1 回答 1

2

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

ColorSync 应该有一个选择退出标志(它是自动且无声的),但由于 ColorSync 可以追溯到“含碳时代”,因此对于如何从 64 位应用程序禁用它存在很多困惑。它甚至可能存在,只是没有文档。但即使是 Adob​​e 也没有弄清楚 AFAIK(OS X 的 64 位 Photoshop ???)是一种资源;)但是,我认为即使是它们的颜色在 64 位 OS X 与 Windows 或 32 位上也可能会有所不同]。

第一个链接讲述了如何以非编程方式在系统范围内强制设置 1.8 的 gamma 值。只是指出它 - 它可能仅对您的应用程序有有限的用途,但很高兴知道。

禁用颜色同步的常用方法是/曾经是

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

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

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

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

于 2012-01-04T19:57:42.047 回答