Comment puis-je obtenir des données d'image à partir QTKit sans couleur ou correction gamma dans Snow Leopard?

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

  •  20-09-2019
  •  | 
  •  

Question

Depuis Snow Leopard, QTKit est maintenant couleur corrigées reviennent données d'image à partir des fonctions comme QTMovies frameImageAtTime: withAttributes: erreur :. Étant donné un fichier AVI non compressé, les mêmes données d'image est affichée avec des valeurs de pixels plus grandes dans Snow Leopard vs Leopard.

Actuellement, je suis en utilisant frameImageAtTime pour obtenir une NSImage, puis demander la tiffRepresentation de cette image. Après avoir fait cela, les valeurs de pixels sont légèrement plus élevés dans Snow Leopard.

Par exemple, un fichier avec la valeur de pixel suivante dans Leopard:

[0 180 0]

a maintenant une valeur de pixel comme:

[0 192 0]

Est-il possible de demander une QTMovie pour des images vidéo qui ne sont pas corrigées couleur? Dois-je poser une CGImageRef, CIImage ou CVPixelBufferRef à la place? Est-il possible de désactiver la correction des couleurs tout à fait avant de lire dans les fichiers vidéo?

Je suis tenté de contourner ce problème en tirant dans un NSBitmapImageRep avec le NSCalibratedColroSpace, mais obtient seulement ma part du chemin:

// 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];

Cela ne reconvertir en une « couleur non corrigée » colorspace, mais les valeurs de couleur ne sont exactement les mêmes que ce qui est stocké dans les fichiers AVI non compressé que nous testons avec. Aussi ce qui est beaucoup moins efficace parce qu'il est convertissait de RGB -> "Device RGB" -.> RGB

En outre, je travaille dans une application 64 bits, afin de descendre à l'API Quicktime-C est pas une option.

Merci pour votre aide.

Était-ce utile?

La solution

est ce que vous utilisez contre: http://support.apple.com/kb/ ht3712 Sont également décrits ici en référence à QT: http://developer.apple. com / bibliothèque / mac / # technotes / tn2227 / _index.html

Il est censé être un opt-out drapeau pour ColorSync (qui est automatique et silencieux), mais parce que ColorSync remonte à l ' « ère de carbone-iferous » il y a beaucoup de confusion sur la façon de le désactiver à partir d'un 64- app bits. Il peut même exister, et juste pas de documentation. Mais même Adobe n'a pas pensé à elle AFAIK (64 bits Photoshop pour Mac OS X ???) [EDIT: En fait, peut-être qu'ils ont fait avec CS5 ou trouvé une solution de contournement ... donc si vous avez des amis qui travaillent là-bas qu'ils peuvent peut-être une ressource;) Cependant, je pense que même leurs couleurs peuvent sortir différents sur 64 bits OS X vs Windows ou 32 bits]

.

Le premier lien indique comment forcer une valeur gamma de 1,8 système et non-programme. Il suffit de le faire remarquer -. Il est probablement d'une utilité limitée pour votre application, mais bien de savoir

La façon habituelle de désactiver ColorSync est / était

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

Mais je ne sais pas si cela va fonctionner dans une application 64 bits (à peu près sûr qu'il ne fonctionne pas). En fait, beaucoup de choses liées à ColorSync sont plus difficiles, peut-être pas encore possible, en 64 bits. Il suffit de chercher. "site: apple.com ColorSync 64 bits"

Si je trouve quelque chose de mieux, je vais modifier ma réponse. Juste pensé que cela vous aidera à connaître l'ennemi, pour ainsi dire.

Une autre édition: (Re) Balisage vos vidéos pourraient atténuer ou éliminer ce problème aussi, puisque ColorSync traite des vidéos non marquées d'une certaine façon (voir les liens) et fonctionne sur les différemment selon les balises. Quel est le profil de couleur de la vidéo? Essayez sRGB peut-être?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top