2010-01-12 5 views
8

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.

+0

¿Cuál es el destino de los píxeles en su mapa de bits? ¿Qué tipo de espacio de color obtienes de [bitmap colorspace]? –

Respuesta

2

Esto es lo que se está ejecutando en contra: http://support.apple.com/kb/ht3712 También se describe aquí en referencia a QT: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

No se supone que es un indicador de exclusión para ColorSync (que es automática y silenciosa), pero Debido a que ColorSync vuelve a la "era de Carbon-iferous", existe una gran confusión sobre cómo desactivarlo desde una aplicación de 64 bits. Incluso puede existir, y simplemente no tiene documentación. Pero incluso Adobe no lo ha descubierto AFAIK (Photoshop 64 bits para OS X ???) [EDITAR: en realidad, tal vez lo hicieron con CS5, o encontraron una solución alternativa ... así que si tienes amigos que trabajan allí tal vez puedan ser un recurso;) Sin embargo, creo que incluso sus colores pueden ser diferentes en 64 bits OS X vs Windows o 32 bits].

El primer enlace explica cómo forzar un valor gamma de 1.8 en todo el sistema y no de forma programática. Simplemente lo señala, probablemente solo sea de uso limitado para su aplicación, pero es bueno saberlo.

La forma habitual de desactivar ColorSync es/era

GraphicsImportSetFlags(gi, kGraphicsImporterDontUseColorMatching); 

Pero no sé si eso va a trabajar en una aplicación de 64 bits (bastante seguro de que no lo hace). De hecho, muchas cosas relacionadas con ColorSync son más difíciles, quizás aún no posibles, en 64 bits. Simplemente busque "site: apple.com colorsync 64 bit".

Si encuentro algo mejor, voy a editar mi respuesta. Solo pensé que esto te ayudaría a conocer al enemigo, por así decirlo.

Otra edición: (Re) Etiquetar sus videos podría mitigar o eliminar este problema también, ya que ColorSync trata los videos no etiquetados de cierta manera (ver enlaces) y opera de manera diferente dependiendo de las etiquetas. ¿Cuál es el perfil de color de los videos? Pruebe sRGB tal vez?

Cuestiones relacionadas