自 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。
谢谢你的帮助。