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 回答