如何在Snow Leopard中从QTKit获取没有颜色或伽马校正的图像数据?

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 ->“设备RGB” -> RGB进行转换,因此效率要低得多。

另外,我正在64位应用程序中工作,因此不考虑使用Quicktime-C API。

感谢您的帮助。


你的位图像素的目标是什么?从 [位图颜色空间] 中获取哪种颜色空间? - alex strange
1个回答

2
这就是你遇到的问题:http://support.apple.com/kb/ht3712 在这里还有关于QT的描述:http://developer.apple.com/library/mac/#technotes/tn2227/_index.html ColorSync应该有一个自动和静默的退出标志,但由于ColorSync可以追溯到“Carbon时代”,所以如何从64位应用程序中禁用它存在很多困惑。它甚至可能存在,只是没有文档。但即使Adobe也没有弄清楚(适用于OS X的64位Photoshop???)[编辑:实际上,也许他们在CS5中找到了解决方法或解决方法......所以如果你有任何在那里工作的朋友,也许他们可以成为资源;) 但是,我认为即使他们的颜色在64位OS X与Windows或32位上也会有所不同]。
第一个链接告诉如何在整个系统中强制设置伽马值为1.8,并非以编程方式。只是指出-它可能仅对您的应用程序有限用处,但了解这一点很好。
通常禁用ColorSync的方法是/是:
GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

但我不确定这是否适用于64位应用程序(几乎可以肯定不行)。实际上,与ColorSync相关的许多事情在64位中更加困难,也许还不可能。只需搜索“site:apple.com colorsync 64 bit”即可了解更多信息。
如果我找到更好的解决方案,我会编辑我的答案。只是想让你了解敌人的情况,这可能有所帮助。
另一个提示:重新标记视频也可能缓解或消除此问题,因为ColorSync以一定方式处理未标记的视频(请参见链接),并根据标记对其进行不同的操作。视频的颜色配置文件是什么?尝试使用sRGB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接