- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自 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 来代替吗?有没有办法在读取视频文件之前完全禁用色彩校正?
我尝试通过使用 NSCalibrateColroSpace 绘制 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。
感谢您的帮助。
最佳答案
这就是您遇到的情况: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 做到了,或者找到了解决方法......所以如果你有在那里工作的 friend 也许他们可以是一种资源;)但是,我认为甚至它们的颜色在 64 位 OS X 与 Windows 或 32 位上可能会有所不同]。
第一个链接讲述如何以非编程方式在系统范围内强制将 gamma 值设置为 1.8。只是指出这一点 - 它可能对您的应用程序的用途有限,但很高兴知道。
禁用颜色同步的常用方法是/曾经
GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching );
但我不知道这是否适用于 64 位应用程序(很确定不会)。事实上,很多与 ColorSync 相关的事情在 64 位中都更加困难,也许还无法实现。只需搜索“site:apple.com colorsync 64 bit”即可。
如果我找到更好的东西,我会编辑我的答案。只是觉得这可以帮助你了解敌人,可以这么说。
另一个编辑:(重新)标记您的视频也可能会减轻或消除此问题,因为 ColorSync 以某种方式处理未标记的视频(请参阅链接),并根据标记对它们进行不同的操作。视频的颜色配置文件是什么?也许尝试一下 sRGB?
关于quicktime - 如何在 Snow Leopard 中从 QTKit 获取图像数据而无需进行颜色或 Gamma 校正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2052504/
我是一名优秀的程序员,十分优秀!