2011-12-26 16 views
0

私はobjective-cを使って画面の平均色を計算する方法を見つけようとしています。Mac画面の平均色

これまでのところ私は素晴らしい作品のスクリーンショットを取得するために、このコードを使用します。

CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay); 

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1]; 
// Create an NSImage and add the bitmap rep to it... 
NSImage *image = [[NSImage alloc] init]; 
[image addRepresentation:bitmapRep]; 

今私の問題は、この画像の平均RGBカラーを計算することです。

Iは、(等しい)の解を見つけたが、RG及びB色成分が常に同じになるように計算した。

NSInteger i = 0; 
NSInteger components[3] = {0,0,0}; 
unsigned char *data = [bitmapRep bitmapData]; 

NSInteger pixels = ([bitmapRep size].width *[bitmapRep size].height); 

do { 
    components[0] += *data++; 
    components[1] += *data++; 
    components[2] += *data++; 
} while (++i < pixels); 

int red = (CGFloat)components[0]/pixels; 
int green = (CGFloat)components[1]/pixels; 
int blue = (CGFloat)components[2]/pixels; 
+1

で同様の質問がありますか?または、3つのチャンネルの値は何になるのですか? – I82Much

+0

あなたのアルゴリズムでは、a)ピクセル内の各チャンネルはi)「符号なしの文字」に適合し、ii)整数として格納され、b)チャンネルはアルファ成分なしでRGB順に格納されます。これらの事柄はすべて本当であると確信していますか? 'bitsPerPixel'と' samplesPerPixel'の値を知っていますか? –

+0

それは常に私に等しい赤、緑、青の値を与えます。たとえば赤= 87緑= 87青= 87 Josh、 いいえわからない。基本的には、画面の平均RGBカラーを取得する最良の方法を見つける方法が必要です。 –

答えて

3

bitmapRepを簡単に分析すると、最初のバイトが未使用、パディングバイト、つまりフォーマットがXRGBであり、Xが使用されていない32ビット(4バイト)があります。 (ピクセル行の最後にパディングバイトはありません)。

もう1つ注意してください。ピクセル数をカウントするには、-(NSSize)sizeメソッドを使用します。
これは決して行うべきではありません!サイズはピクセルとは関係ありません。スクリーンやプリンタ上で画像をどれだけ大きく描くべきか(インチまたはcmまたはmmで表現する)だけです。ピクセル数をカウントするには、-(NSInteger)pixelsWide-(NSInteger)pixelsHighを使用する必要があります。しかし、-sizeの(間違った)使用はimageRepの解像度が1インチあたり72ドットの場合にのみ有効です。

最後に:彼らはゼロに出てきているAverage Color of Mac Screen

+0

これを修正するために私のコードを変更する必要がありますか? (バイト数ではなく、4バイトについて) あなたのリンクは、同様の質問です。私自身の(この)質問につながります。 –

+2

これを行う最も単純な(そして最も醜い)方法は、 'data ++;'をdoループの最初のステートメントとして追加することです。これは、最初の(未使用の)バイトをスキップします。ピクセルの最後のバイトが使用されない場合は、doループの最後の文として 'data ++;'を追加します。もちろん、すべてのピクセルについてより慎重な反復が好ましい。 –

+0

ありがとう、それは魅力のように動作します! –

2

あなたのデータは、おそらく4ピクセルあたりのバイト(としない3として整列されますあなたが想定しているようにバイト数)。それはあなたが得るほぼ等しい値を(統計的に)説明するでしょう。

+0

ありがとうございます。どうすればこの問題を解決できますか?しかし、これはなぜ私が赤、緑、青を常に同じにするのかを説明していますか? –