2

私はビット演算子(&| ^)を読みましたが、次のことを理解しています。

alpha = 0xFF000000 >> 24 ;
blue = 0xFF0000FF & 0x000000FF;
red = 0xFFFF0000>>16 & 0x000000FF;
green = 0xFF00FF00>>8 & 0x000000FF;

次に、他の色をマスクして、赤または青(など)のコンポーネントを使用できます。

int color = alpha | blue | red | green;

それから私はいわば色を再構築します。私が興味を持っているのは、Javaで2つの色の間に双一次補間を作成したい場合はどうなるかということです。どうすればそれを構築できますか?標準の緑色(0xFF00FF00)で始まり、黒(0xFF000000)で終わります。真ん中の色は、最終的に黒になるまで、緑から濃い緑に変わります。上部が緑色で始まるbufferedImageを作成してから、前のピクセルの色を読み取り、前の色の新しいバージョンまで何かをシフトするforループを作成する必要があると思います。作成されます。残念ながら、ビット単位の演算とシフトを理論的に理解しているため、これを実装する方法がわかりませんが、この目的にそれらを適用する方法がわかりません。どんな助けでも大歓迎です!前もって感謝します!

4

2 に答える 2

3

EJPが指摘したように、マスクは、カラーコンポーネント/チャネル(赤、緑、青)の1つの値を除外するために使用されます。そして、それは通常、ビットシフト/マスキング操作で行うことです。あなたが得る値であなたがする他のすべては算術またはより高度な数学です。

カラーチャネルの範囲は0〜255、または16進値で0x00〜0xFFです。それを再構築するには、コンポーネントの値を元の場所にビットシフトする必要があります。これは、単純な算術加算と組み合わせることができます。

// Example values
int r = 255; // 0xFF
int g = 1;   // 0x01
int b = 15;  // 0x0F

// go back to original form:
                      //    A  R  G  B
int color = r << 16;  // 0x00.FF.00.00
color += g << 8;      // 0x00.FF.01.00
color += b;           // 0x00.FF.01.0F

// just add back the alpha if it is going to be full on
color = += 255 << 24; // 0xFF.FF.01.0F

色間で補間を行う場合は、すべての色を1つの整数にまとめるのではなく、各色コンポーネントに対して個別に行う必要があります。場合によっては、表現を[0-255]から10進数の[0.0f-1.0f]に変更することもお勧めします。

// Darken red value by 50%
int color = ...; // some color input
int mask = 0xFF;

int a = (color >> 24) & mask;
int r = (color >> 16) & mask;
int g = (color >> 8) & mask;
int b = color & mask;

// convert to decimal form:
float rDecimal = r / 255f; 
  // Let r: 0x66 = 102 => rDecimal: 0.4

// darken with 50%, basically divide it by two
rDecimal = r/2; 
  // rDecimal: 0.2

// Go back to original representation and put it back to r
r = (int)(rDecimal * 255); 
  // r: 51 = 0x33

// Put it all back in place
color = (a << 24) + (r << 16) + (g << 8) + b;

これがお役に立てば幸いです。

于 2012-09-09T07:37:03.187 に答える
2

私は次のことを行うとしたら、それを理解しています。

いいえ、まったくわかりません。すべてのビットシフトの結果は、4つのケースすべてに当てはまりますが0xff、これは明らかに正しくありません。アルファマスクは0xff000000、青マスクは0xff、赤マスクは0xff0000、緑マスクは0xff00です。これらはマスクで&あり、関連するチャネルをマスクするために、演算子を使用して実際のピクセルに適用する必要があります。先に進む前に、それを理解する必要があります。

于 2012-09-09T05:28:16.810 に答える