Como posso obter dados de imagem do qtkit sem correção de cor ou gama no leopardo da neve?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Desde que o Snow Leopard, o Qtkit agora está retornando dados de imagem corrigida por cores de funções como QTMovies FrameImageattime: Withattributes: Erro:. Dado um arquivo AVI não compactado, os mesmos dados de imagem são exibidos com valores maiores de pixels no Leopard Snow vs. Leopard.

Atualmente, estou usando o FrameImageattime para obter um NSImage e, em seguida, peça a representação tiffRepresentation dessa imagem. Depois de fazer isso, os valores de pixels são um pouco mais altos no leopardo da neve.

Por exemplo, um arquivo com o seguinte valor de pixel no Leopard:

[0 180 0]

Agora tem um valor de pixel como:

[0 192 0]

Existe alguma maneira de pedir a um qtmovie para quadros de vídeo que não são corrigidos com cores? Devo estar pedindo um CGIMAGEREF, CIIMAGE ou CVPIXELBUFFERREF? Existe uma maneira de desativar completamente a correção de cores antes da leitura nos arquivos de vídeo?

Tentei contornar esse problema atraindo um nsbitmapimagerep com o NSCalibratedColrossace, mas isso só faz a minha parte do caminho:

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

Isso converte novamente em um espaço de cores 'sem cor corrigido', mas os valores de cores não são exatamente os mesmos que são armazenados nos arquivos AVI não compactados com os quais estamos testando. Além disso, isso é muito menos eficiente porque está convertendo do RGB -> "Dispositivo RGB" -> RGB.

Além disso, estou trabalhando em um aplicativo de 64 bits, então cair na API do Quicktime-C não é uma opção.

Obrigado pela ajuda.

Foi útil?

Solução

É isso que você está enfrentando: http://support.apple.com/kb/ht3712Também descrito aqui em referência ao qt: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html

Deveria haver uma bandeira de exclusão para o ColorSync (que é automático e silencioso), mas como o ColorSync remonta à "Era de Carbono-I / Ifer", há muita confusão sobre como desativá-lo de um aplicativo de 64 bits. Pode até existir e não ter apenas documentação. Mas mesmo a Adobe não descobriu isso Afaik (Photoshop de 64 bits para OS X ???) [Editar: Na verdade, talvez eles fizessem com CS5 ou encontrassem uma solução alternativa ... então se você tiver algum amigo que trabalhe lá, talvez eles possam Seja um recurso;) No entanto, acho que mesmo suas cores podem sair diferentes em 64 bits OS X vs Windows ou 32 bits].

O primeiro link informa como forçar um valor gama de 1,8 em todo o sistema e não programaticamente. Apenas apontando para isso - provavelmente é apenas de uso limitado para o seu aplicativo, mas é bom saber.

A maneira usual de desativar o ColorSync é/foi

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

Mas não sei se isso vai funcionar em um aplicativo de 64 bits (com certeza não faz). De fato, muitas coisas relacionadas ao ColorSync são mais difíceis, talvez ainda não possíveis, em 64 bits. Basta pesquisar "Site: Apple.com Colorync 64 Bit".

Se eu encontrar algo melhor, editarei minha resposta. Apenas pensei que isso o ajudaria a conhecer o inimigo, por assim dizer.

Outra edição: (re) marcando seus vídeos pode mitigar ou eliminar esse problema também, já que o ColorSync trata os vídeos sem marcação de uma certa maneira (consulte os links) e opera com eles de maneira diferente, dependendo das tags. Qual é o perfil de cores dos vídeos? Experimente SRGB, talvez?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top