0

私の意見では、小さな問題に苦しんでいます。特定の画像を補完画像にする変換関数を実装するタスクがあります。私のコードは機能し、異なる色の画像を出力しますが、関数が互いに補完する色相を本当に変換しているかどうかはわかりません。参照用にコードの最も重要な部分を含めました。ポインタはありますか?

float hue,sat,brightness;
int rgbValues;

float[]hsbVals=Color.RGBtoHSB(red, green , blue , null );
hue=hsbVals[0];
sat=hsbVals[1];
brightness=hsbVals[2]; 

rgbValues=Color.HSBtoRGB(hue, sat, brightness);
red=(rgbValues << 16)& 0xFF;
green=(rgbValues << 8) & 0xFF;
blue= rgbValues & 0xFF;


/* Put these values into imageTwo */
imageTwo.setRGB(x, y,red, green, blue);
 }
}  
4

1 に答える 1

0

ここでRGB整数を「解凍」しようとしているようです:

red=(rgbValues << 16)& 0xFF;
green=(rgbValues << 8) & 0xFF;
blue= rgbValues & 0xFF;

しかし、あなたは間違った方向にシフトしています。Color.getRGBを参照してください。

red = (rgbValues >>> 16) & 0xFF;
green = (rgbValues >>> 8) & 0xFF;
blue = rgbValues & 0xFF;

現在、補数を得るために何もしていません。左シフトにより赤と緑が常に0になるため、異なる色が得られます。補色が補色を意味する場合、色相を180度回転させる必要があります。

float[] hsb = Color.RGBtoHSB(Color.CYAN.getRed(), Color.CYAN.getBlue(), Color.CYAN.getGreen(), new float[3]);
hsb[0] = hsb[0] + 0.5f > 1.0f ? hsb[0] - 0.5f : hsb[0] + 0.5f;
Color shouldBeRed = new Color(Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]));
于 2013-11-05T19:43:09.593 に答える