Wie kann ich Bilddaten von Qtkit ohne Farbe oder Gamma -Korrektur in Schnee Leopard erhalten?

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

  •  20-09-2019
  •  | 
  •  

Frage

Seit Schneeleopard gibt QTKit jetzt farbkorrigierte Bilddaten aus Funktionen wie Qtmovies FramimageatTime: WithAttributes: Fehler:. Bei einer unkomprimierten AVI -Datei werden dieselben Bilddaten mit größeren Pixelwerten in Schneeleopard vs. Leopard angezeigt.

Derzeit verwende ich FrameImageatTime, um ein NSIMage zu erhalten, und fragen Sie dann nach der Tiffrepräsentation dieses Bildes. Danach sind die Pixelwerte in Schneeleopard etwas höher.

Zum Beispiel eine Datei mit dem folgenden Pixelwert in Leopard:

[0 180 0]

Jetzt hat ein Pixelwert wie:

[0 192 0]

Gibt es eine Möglichkeit, einen QTMovie nach Videorahmen zu fragen, die nicht farblich korrigiert werden? Sollte ich stattdessen nach einem CGImageRef-, CIImage- oder CVPixelBufferRef -Unternehmen bitten? Gibt es eine Möglichkeit, die Farbkorrektur vor dem Lesen in den Videodateien insgesamt zu deaktivieren?

Ich habe versucht, dieses Problem zu verarbeiten, indem ich mich in ein NSbitmapimagePep mit dem NSCalibratcolrospace einbezogen habe, aber das bekommt nur meinen Teil des Weges dort:

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

Dies konvertiert in einen "nicht farbkorrigierten" Farbbereich zurück, aber die Farbwerte sind nicht genau das gleiche wie das, was in den unkomprimierten AVI -Dateien gespeichert ist, mit denen wir testen. Dies ist auch viel weniger effizient, da es von RGB -> "Gerät RGB" -> RGB konvertiert.

Außerdem arbeite ich in einer 64-Bit-Anwendung, daher ist es keine Option, auf die QuickTime-C-API zu fallen.

Danke für Ihre Hilfe.

War es hilfreich?

Lösung

Daran rennen Sie: http://support.apple.com/kb/ht3712Auch hier in Bezug auf QT beschrieben: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

Es soll eine Opt-out-Flagge für Colorsync geben (was automatisch und still ist), aber weil Colorsync auf die "Carbon-Riemen-Ära" zurückgeht, besteht viel Verwirrung darüber, wie man sie von einer 64-Bit-App deaktiviert. Es kann sogar existieren und nur keine Dokumentation haben. Aber selbst Adobe hat es nicht herausgefunden, Afaik (64 -Bit -Photoshop für OS X ???) [Bearbeiten: Vielleicht haben sie vielleicht mit CS5 oder eine Problemumgehung gefunden ... wenn Sie Freunde haben, die dort arbeiten, können sie vielleicht können sie können Seien Sie eine Ressource;) Ich denke jedoch, dass selbst ihre Farben bei 64 Bit OS X gegen Windows oder 32 Bit unterschiedlich sein können.

Der erste Link zeigt, wie ein Gamma-Wert von 1,8 systemweit und nicht programmatisch erzwungen wird. Einfach darauf hinweisen - es ist wahrscheinlich nur für Ihre Bewerbung nur begrenzt, aber gut zu wissen.

Die übliche Art, Colorsync zu deaktivieren, ist/war/war

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

Aber ich weiß nicht, ob das in einer 64-Bit-Anwendung funktioniert (ziemlich sicher, dass dies nicht der Fall ist). Tatsächlich sind viele Dinge, die mit Colorsync zusammenhängen, in 64-Bit schwieriger, vielleicht noch nicht möglich. Suchen Sie einfach "Site: Apple.com Colorsync 64 Bit".

Wenn ich etwas Besseres finde, werde ich meine Antwort bearbeiten. Ich dachte nur, dies würde dir helfen, den Feind sozusagen zu kennen.

Eine andere Bearbeitung: (erneut) Markierung Ihrer Videos kann dieses Problem ebenfalls mildern oder beseitigen, da Colorsync nicht getagierte Videos auf eine bestimmte Weise behandelt (siehe Links) und je nach Tags unterschiedlich. Was ist das Farbprofil der Videos? Versuchen Sie es vielleicht mit SRGB?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top