私は NSColor を持っていますが、それが表す 32 ビットの RGBA 値が本当に必要です。これを取得する簡単な方法はありますか? float コンポーネントを抽出してから、乗算と OR を実行し、一般的にエンディアンに依存する全体的な処理を行う以外に、何か簡単な方法はありますか?
編集:助けてくれてありがとう。本当に、私が望んでいたのは、すでにこれを行っている Cocoa 関数でしたが、自分でそれを行うことに満足しています。
私は NSColor を持っていますが、それが表す 32 ビットの RGBA 値が本当に必要です。これを取得する簡単な方法はありますか? float コンポーネントを抽出してから、乗算と OR を実行し、一般的にエンディアンに依存する全体的な処理を行う以外に、何か簡単な方法はありますか?
編集:助けてくれてありがとう。本当に、私が望んでいたのは、すでにこれを行っている Cocoa 関数でしたが、自分でそれを行うことに満足しています。
別のより強引なアプローチは、一時的な CGBitmapContext を作成し、色で塗りつぶすことです。
NSColor *someColor = {whatever};
uint8_t data[4];
CGContextRef ctx = CGBitmapContextCreate((void*)data, 1, 1, 8, 4, colorSpace, kCGImageAlphaFirst | kCGBitmapByteOrder32Big);
CGContextSetRGBFillColor(ctx, [someColor redComponent], [someColor greenComponent], [someColor blueComponent], [someColor alphaComponent]);
CGContextFillRect(ctx, CGRectMake(0,0,1,1));
CGContextRelease(ctx);
FWIW、コンポーネントのカラー値ごとに 8 ビットのエンディアンの問題はありません。エンディアンは 16 ビット以上の整数のみです。メモリは好きなようにレイアウトできますが、ビッグ エンディアン マシンでもリトルエンディアン マシンでも、8 ビット整数値は同じです。(ARGB は、Core Graphics と Core Image のデフォルトの 8 ビット形式だと思います)。
なぜこれだけではないのですか?:
uint32_t r = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor redComponent])) * 255.0f);
uint32_t g = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor greenComponent])) * 255.0f);
uint32_t b = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor blueComponent])) * 255.0f);
uint32_t a = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor alphaComponent])) * 255.0f);
uint32_t value = (r << 24) | (g << 16) | (b << 8) | a;
そうすれば、それがメモリにどのように配置されているかが正確にわかります。
または、これがより明確な場合:
uint8_t r = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor redComponent])) * 255.0f);
uint8_t g = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor greenComponent])) * 255.0f);
uint8_t b = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor blueComponent])) * 255.0f);
uint8_t a = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor alphaComponent])) * 255.0f);
uint8_t data[4];
data[0] = r;
data[1] = g;
data[2] = b;
data[3] = a;
すべての色にRGBA 表現があるわけではありません。RGBA に近似値がある場合がありますが、正確である場合とそうでない場合があります。さらに、Core Graphics によってパターンとして描画される「色」があります (たとえば、Mac OS X の一部のリリースでのウィンドウの背景色)。
4 つの浮動小数点数を整数表現に変換することが唯一の方法です。