Snow Leopardで色やガンマ補正なしでQTKITから画像データを取得するにはどうすればよいですか?
質問
Snow Leopard以来、QtkitはQtmovies frameimageattimeのような関数から色を修正した画像データを返しています:withattributes:error:。非圧縮AVIファイルを考えると、同じ画像データがSnow Leopard vs. Leopardのより大きなピクセル値で表示されます。
現在、frameimageattimeを使用してnsimageを取得してから、その画像のtiffrepresentationを求めています。これを行った後、ピクセル値はスノーヒョウでわずかに高くなります。
たとえば、ヒョウに次のピクセル値を持つファイル:
[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にドロップダウンすることはオプションではありません。
ご協力いただきありがとうございます。
解決
これはあなたが走っていることです: http://support.apple.com/kb/ht3712また、QTに関してここで説明しています: http://developer.apple.com/library/mac/#technotes/tn2227/_index.html
ColorSync(自動でサイレント)のオプトアウトフラグがあるはずですが、Colorsyncが「炭素乳頭時代」に戻るため、64ビットアプリからそれを無効にする方法については多くの混乱があります。存在する可能性があり、文書がありません。しかし、Adobeでさえ、Afaik(OS Xの64ビットPhotoshop ??? ???)を理解していません[編集:実際、彼らはCS5でやったか、回避策を見つけました...だからあなたがそこで働いている友人がいるなら、彼らはできるかもしれません。リソースになる;)しかし、64ビットOS X対ウィンドウまたは32ビットで色でさえ異なると思います。
最初のリンクは、システム全体で1.8のガンマ値を強制的に強制的に、非プログラムで強制する方法を示しています。それを指摘するだけです - それはおそらくあなたのアプリケーションには限られた使用のみですが、知っておくと良いでしょう。
ColoryNcを無効にする通常の方法は/でした
GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching );
しかし、それが64ビットアプリケーションで機能するかどうかはわかりません(確かにそうではないと確信しています)。実際、ColoryNcに関連する多くのことは、64ビットではより困難であり、まだ不可能です。 「サイト:Apple.com Colorsync 64ビット」を検索するだけです。
もっと良いものを見つけたら、答えを編集します。これは、いわば敵を知るのに役立つと思っただけです。
別の編集:(再)あなたの動画のタグ付けは、この問題を軽減または排除するかもしれません。ビデオのカラープロファイルは何ですか?多分srgbを試してみませんか?