2016-05-17 3 views
1

コンテキスト:私はOSXのアプリケーションにおける色赤(255,0,0)を充填したウインドウを表示しています表示する本当の色

。このウィンドウが表示されているときに私はスクリーングラブを行っています。今、私は、ウィンドウがペイントされたピクセルの値を読むと、ピクセルの値は実際には251,0,7です。

私はスクリーングラブをしている間に何かがうんざりしていると思ったので、私はMacのデジタルカラーユーティリティを使って色をチェックしました。同じ値 - 251,0,7を得ました。

画像をレンダリングするときに何か起こっていることを指摘しています。だから、私はもう1つの実験を次のように試してみました:すべてのピクセルにわたって赤色(255,0,0)で塗りつぶされたイメージを作成し、それをpngとしてエクスポートし、Macのイメージビューアで開きました。 OS自体でレンダリングされたこの画像では、デジタルカラーメーターを実行しましたが、まだピクセル値として251,0,7を得ました。

これはちょうどMacのことだと思いましたが、最後の実験として画像を自分宛に郵送し、画像ビューアを使ってGmailに開いてみました。 デジタルカラーメーター画像のピクセルの値255,0,0を示しています。つまり、何とかGoogleの画像ビューアが正確な色をレンダリングすることができるため、正確な色を表示することができます。 赤は正しく表示されますが(255,0,0)、緑と青は正しくありません。

質問:

誰かがマックで本当の色を表示する方法を示しリソース/コードに私を指すことができますか?言い換えれば、ウィンドウに色を表示する方法はありますか?表示されたウィンドウのscreengrabを実行すると、私が描いたのとまったく同じ色が得られますか?

アップデート:私は使用していた画像を追加する

。私は今使用しています

enter image description here

コード:ここで

NSRect windowRect = {200,200,200,200};//{m_windowOriginX, m_windowOriginY, m_windowSizeX, m_windowSizeY}; 

m_NSWindow = [[NSWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 

[m_NSWindow setTitle:@"overlayWindow"]; 

[m_NSWindow makeKeyAndOrderFront:nil]; 

g_imageView = [[NSImageView alloc] initWithFrame:NSMakeRect(0,0,200,200)]; 

[m_NSWindow.contentView addSubview:g_imageView]; 



NSColor *backgroundColor = [m_NSWindow backgroundColor]; 

backgroundColor = [NSColor clearColor]; 

[m_NSWindow setBackgroundColor:backgroundColor]; 



[m_NSWindow setOpaque:YES]; 

//[m_NSWindow setAlphaValue:1.0]; 



naivePremultiplyRGBAMat(m_paintBuffer); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef bitmapContext = CGBitmapContextCreate(m_paintBuffer.data, 200, 200, 8, 800, colorSpace, kCGImageAlphaPremultipliedLast); 

CFRelease(colorSpace); 



CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); 



CGContextRelease(bitmapContext); 

naivePreMultiplyRGBAMatは私が事前に乗算アルファ成分に書いたカスタム関数です。

NSSize imageSize = NSMakeSize(200,200); 

NSImage* myImage = [[NSImage alloc] initWithCGImage: cgImage size: NSMakeSize(

        CGBitmapContextGetWidth(bitmapContext), 

        CGBitmapContextGetHeight(bitmapContext))]; 


[g_imageView setImage:myImage]; 
+2

表示色のプロファイルは影響を受けませんか? – trojanfoe

+0

良い点。どの場合、現在の表示カラープロファイルがプログラムでレンダリングされた色にどのような変換を適用するかを知ることは可能でしょうか?この方法で、少なくとも私はscreengrabでどの色を期待すべきか知っています。今、私はscreengrabで色Xを得ることを望んで、私はそれを色Xを与えますが、私の得たものは、私の論理の残りの部分を混乱させる別の色、X 'です – TheBlueNotebook

+0

しかし、知識。しかし、[This](https://developer.apple.com/library/ios/technotes/tn2313/_index.html)は興味深いようです。 – trojanfoe

答えて

1

私の画像の生データに存在するようなスクリーンショット/デジタルカラーメーターで同じ色が得られないという問題は、カラープロファイルによって説明されます。基本的には、RGB値が255,0,0の場合、カラープロファイルに関連付けるまで意味がありません。 Macで画像を表示しようとすると、この画像が通過する3つの異なるバッファがあり、それぞれのバッファには関連するカラープロファイルがあります。ここ

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef bitmapContext = CGBitmapContextCreate(m_paintBuffer.data, 200, 200, 8, 800, colorSpace, kCGImageAlphaPremultipliedLast); 

colorSpace変数は、この色空間のカラープロファイルを設定している:

最初のバッファは、私は上記の投稿コードのコードの次の行で作成された画像バッファそのものです。それに関連したいくつかの色空間を有するかもしれないモニタ自体を

[m_NSWindow setColorSpace: [NSColorSpace genericRGBColorSpace]]

及び第3のバッファされた:

第2のバッファは、私は、次のコードを用いて色空間を指定できるため、ウィンドウ・バッファであります - システム環境設定で表示を選択することで変更できます。

これで、このパイプライン(イメージバッファからウィンドウバッファへのモニタバッファ)でイメージを送信するとき、これらのバッファのカラープロファイルがそれぞれ異なる場合、適切なカラー変換が行われます。したがって、画像バッファーのカラー値r,g,bは、モニターバッファーに到達するまでにr',g',b'に変換される可能性があります。

さらに、モニタバッファにあるものを画面グラブに対応するバッファにコピーすると、別の変換が行われ、最後に読み取った値がこれらの値になります。

ここで、ソース画像と画像バッファをscreengrabと同じ値にするための簡単な方法は、両方が同じカラープロファイルを持つようにすることです。しかし、カラープロファイルAからカラープロファイルBに変換してからカラープロファイルAに戻すときに、情報が失われるため、パイプライン(ウィンドウ/モニタなど)のすべてのバッファで同じカラープロファイルを維持することをお勧めします。

関連する問題