¿Cómo puedo obtener datos de imagen de QTKIT sin color o corrección gamma en el leopardo de las nieves?

StackOverflow https://stackoverflow.com/questions/2052504

  •  20-09-2019
  •  | 
  •  

Pregunta

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, los mismos datos de imagen se muestran con valores de píxeles más grandes en Snow Leopard vs. Leopard.

Actualmente estoy usando FrameImageattime para obtener una NSIMAGE, luego solicite la TIFRepresentation de esa imagen. Después de hacer esto, los valores de píxeles son ligeramente más altos en el leopardo de la nieve.

Por ejemplo, un archivo con el siguiente valor de píxel en leopardo:

[0 180 0]

Ahora tiene un valor de píxel como:

[0 192 0]

¿Hay alguna forma de pedirle a un Qtmovie para marcos de video que no se corrigan el color? ¿Debería pedir un CGIMageref, CIIMAGE o CVPIXELBUFFERREF en su lugar? ¿Hay alguna forma de deshabilitar la corrección de color por completo antes de leer en los archivos de video?

He intentado trabajar en este problema dibujando en un NSBITMAPIMAGEREP con el NscalibratedColrospace, pero eso solo obtiene mi parte del camino allí:

// 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 se convierte en un espacio de colores 'no corregido por color', pero los valores de color no son exactamente los mismos que se almacenan en los archivos AVI sin comprimir con los que estamos probando. Además, esto es mucho menos eficiente porque se está convirtiendo desde RGB -> "dispositivo RGB" -> RGB.

Además, estoy trabajando en una aplicación de 64 bits, por lo que caer a la API QuickTime-C no es una opción.

Gracias por tu ayuda.

¿Fue útil?

Solución

Esto es con lo que estás corriendo: http://support.apple.com/kb/ht3712También se describe aquí en referencia a Qt: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

Se supone que hay una bandera de exclusión para ColorSync (que es automática y silenciosa), pero debido a que ColorSync se remonta a la "Era de Carbon-Iffer", hay mucha confusión sobre cómo deshabilitarlo de una aplicación de 64 bits. Incluso puede existir, y simplemente no tiene documentación. Pero incluso Adobe no lo ha descubierto AFAIK (64 bit Photoshop para OS X? Sea un recurso;) Sin embargo, creo que incluso sus colores pueden salir diferentes en OS X de 64 bits vs Windows o 32 bits].

El primer enlace le dice cómo forzar un valor gamma de 1.8 en todo el sistema y no procesamáticamente. Solo apuntándolo, probablemente solo sea de uso limitado para su aplicación, pero es bueno saberlo.

La forma habitual de deshabilitar ColorSync es/era

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

Pero no sé si eso va a funcionar 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, tal vez aún no posibles, en 64 bits. Simplemente busque "Sitio: Apple.com ColorSync 64 bit".

Si encuentro algo mejor, 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 videos sin etiquetar de cierta manera (ver enlaces) y opera en ellos de manera diferente dependiendo de las etiquetas. ¿Cuál es el perfil de color de los videos? ¿Prueba srgb tal vez?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top