2010-01-12 66 views
8

由于Snow Leopard,QTKit现在正在从QTMovies frameImageAtTime:withAttributes:error:返回色彩校正图像数据。给定一个未压缩的AVI文件,相同的图像数据在Snow Leopard vs. Leopard中以更大的像素值显示。如何从雪豹的QTKit中获取图像数据而无需颜色或伽马校正?

目前,我正在使用frameImageAtTime来获取NSImage,然后请求该图像的tiffRepresentation。完成此操作后,雪豹的像素值稍高。

例如,在豹以下像素值的文件:

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

这并转换​​回的“非色彩校正'colorspace,但颜色值NOT与存储在我们正在测试的未压缩AVI文件中的值完全相同。而且这样效率低得多,因为它是从RGB转换到“Device RGB” - > RGB。

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

感谢您的帮助。

+0

你的位图中像素的目的地是什么?你从[位图颜色空间]得到什么样的色彩空间? – 2012-01-03 00:37:31

回答

2

这是你对运行的是什么了:http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

有被认为是对的ColorSync(这是自动和静音)选择退出的标志,但:还描述了参考QT http://support.apple.com/kb/ht3712 由于ColorSync可以回到“碳排放时代”,所以关于如何从64位应用程序中禁用它,存在很多混淆。它甚至可能存在,只是没有文档。但即使是Adobe还没有弄清楚它AFAIK(64位Photoshop的OS X ???)[编辑:其实,也许他们做了CS5,或找到了解决方法...所以如果你有任何朋友谁在那里工作也许他们可以是一种资源;)但是,我认为即使它们的颜色在64位OS X与Windows或32位上可能会有所不同。

第一个链接告诉我们如何强制1.8系统范围内的伽马值和非编程方式。只是指出它 - 它可能只是对你的应用程序有限的使用,但很好知道。

通常的方法来禁用的ColorSync是/是

GraphicsImportSetFlags(gi, kGraphicsImporterDontUseColorMatching); 

但我不知道这是怎么回事在64位应用程序的工作(非常肯定它不会)。事实上,与ColorSync相关的许多事情在64位中都比较困难,可能还不可能。只需搜索“网站:apple.com colorsync 64位”。

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

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