Desde Snow Leopard, QTKit ahora está devolviendo datos de imagen corregidos de color de funciones como QTMovies frameImageAtTime: withAttributes: error :. Dado un archivo AVI sin comprimir, se muestran los mismos datos de imagen con valores de píxel más grandes en Snow Leopard vs. Leopard.¿Cómo puedo obtener datos de imagen de QTKit sin corrección de color o gamma en Snow Leopard?
Actualmente estoy usando frameImageAtTime para obtener un NSImage, luego solicito el tiffRepresentation de esa imagen. Después de hacer esto, los valores de píxel son un poco más altos en Snow Leopard.
Por ejemplo, un archivo con el valor de píxel siguiente en Leopard:
[0 180 0]
tiene ahora un valor de píxel como:
[0 192 0]
¿Hay alguna manera de hacer una QTMovie de fotogramas de vídeo que ¿no se corrige el color? ¿Debo pedir un CGImageRef, CIImage o CVPixelBufferRef en su lugar? ¿Hay alguna forma de desactivar por completo la corrección del color antes de leer en los archivos de video?
he intentado solucionar este problema mediante la elaboración en un NSBitmapImageRep con el NSCalibratedColroSpace, pero que sólo consigue mi parte del camino:
// 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];
Esto convertir de nuevo a un 'no color corregido 'espacio de color, pero los valores de color NO son exactamente los mismos que los almacenados en los archivos AVI sin comprimir con los que estamos probando. También esto es mucho menos eficiente porque está convirtiendo de RGB -> "Dispositivo RGB" -> RGB.
Además, estoy trabajando en una aplicación de 64 bits, por lo que bajar a la API de Quicktime-C no es una opción.
Gracias por su ayuda.
¿Cuál es el destino de los píxeles en su mapa de bits? ¿Qué tipo de espacio de color obtienes de [bitmap colorspace]? –