8

Snow Leopard 以降、QTKit は QTMovies frameImageAtTime:withAttributes:error: などの関数から色補正された画像データを返すようになりました。圧縮されていない AVI ファイルを指定すると、Snow Leopard と Leopard では同じ画像データがより大きなピクセル値で表示されます。

現在、frameImageAtTime を使用して NSImage を取得し、その画像の tiffRepresentation を要求しています。これを行うと、Snow Leopard のピクセル値がわずかに高くなります。

たとえば、Leopard で次のピクセル値を持つファイル:

[0 180 0]

次のようなピクセル値があります。

[0 192 0]

色補正されていないビデオ フレームを QTMovie に要求する方法はありますか? 代わりに CGImageRef、CIImage、または CVPixelBufferRef を要求する必要がありますか? ビデオ ファイルを読み込む前に色補正を完全に無効にする方法はありますか?

NSCalibratedColroSpace を使用して NSBitmapImageRep に描画することで、この問題を回避しようとしましたが、それは私の部分しか得られません。

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

これは「色補正されていない」色空間に変換されますが、色の値は、テストしている非圧縮 AVI ファイルに保存されているものとまったく同じではありません。また、これは RGB -> "Device RGB" -> RGB から変換するため、効率が大幅に低下します。

また、私は 64 ビット アプリケーションで作業しているため、Quicktime-C API にドロップダウンすることはできません。

ご協力いただきありがとうございます。

4

1 に答える 1

2

これはあなたが直面しているものです: http://support.apple.com/kb/ht3712 また、QT に関してここで説明されています: http://developer.apple.com/library/mac/#technotes/tn2227/ _index.html

ColorSync にはオプトアウト フラグ (自動でサイレント) があるはずですが、ColorSync は「脱炭素時代」にさかのぼるため、64 ビット アプリから無効にする方法について多くの混乱が生じています。存在することさえありますが、ドキュメントがありません。しかし、Adobe でさえ理解していません (OS X 用の 64 ビット Photoshop ???) [編集: 実際には、CS5 でやったか、回避策を見つけたのかもしれません...そこで働いている友人がいる場合は、できるかもしれません。リソースになります;)ただし、64ビットOS XとWindowsまたは32ビットでは、それらの色でさえ異なる場合があると思います]。

最初のリンクは、システム全体で非プログラム的に 1.8 のガンマ値を強制する方法を示しています。それを指摘するだけです-おそらくあなたのアプリケーションでは限られた用途しかありませんが、知っておくとよいでしょう.

colorsync を無効にする通常の方法は、is/was です。

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

しかし、それが 64 ビット アプリケーションで機能するかどうかはわかりません (機能しないことは確かです)。実際、ColorSync に関連する多くのことは、64 ビットではより困難であり、おそらくまだ不可能です。「site:apple.com colorsync 64 ビット」で検索してください。

もっと良いものを見つけたら、答えを編集します。いわば、これが敵を知るのに役立つと思っただけです。

別の編集: (再) ビデオにタグを付けると、この問題も軽減または解消される可能性があります。これは、ColorSync がタグなしのビデオを特定の方法で扱い (リンクを参照)、タグに応じて異なる方法で動作するためです。ビデオのカラー プロファイルとは何ですか? sRGBを試してみてください。

于 2012-01-04T19:57:42.047 に答える