Java 补码图像-从图像像素读取rgb值,并实现适当的变换功能

Java 补码图像-从图像像素读取rgb值,并实现适当的变换功能,java,image-processing,image-manipulation,Java,Image Processing,Image Manipulation,在我看来,我一直在努力解决一个小问题。我的任务是实现一个转换函数,使给定的图像成为补码图像。我的代码工作,输出和图像有不同的颜色,但是我不确定这个功能是否真的转换了互补的色调。我已经包含了代码中最重要的部分以供参考。有什么建议吗 float hue,sat,brightness; int rgbValues; float[]hsbVals=Color.RGBtoHSB(red, green , blue , null ); hue=hsbVals[0]; sat=hsbVals[1]; bri

在我看来,我一直在努力解决一个小问题。我的任务是实现一个转换函数,使给定的图像成为补码图像。我的代码工作,输出和图像有不同的颜色,但是我不确定这个功能是否真的转换了互补的色调。我已经包含了代码中最重要的部分以供参考。有什么建议吗

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);
 }
}  
浮动色调、sat、亮度;
int rgb值;
float[]hsbVals=Color.RGBtoHSB(红、绿、蓝、空);
色调=hsbVals[0];
sat=hsbVals[1];
亮度=hsbVals[2];
RGB值=颜色.HSBtoRGB(色调、饱和度、亮度);

红色=(RGB值看起来您正在尝试在此处“解包”RGB整数:

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]));

为什么你要把它们转换成hsb和rgb?我不确定转换成rbg背后的真正原因,但我遵循了这篇文章。这不是完整的算法,试着详细阅读问题和答案。是的,我发现她在寻找一种更有效的方法。我只想把一个给定的图像及其颜色转换为自身的补充。我的问题是,我上面的实现有什么问题吗?是的,你将rgb值转换为hsb,然后再转换回来,没有任何目的或效果,你永远不会改变这些值。耶,我只需要将色调旋转180,但我不知道它的编码…谢谢你认为这是正确的吗?色调=色调+0.5f>1.0f?sat-0.5f:亮度+0.5f;因为您使用了hsb,当我在netbeans中尝试该行时,它给了我错误我忘记了数组索引。Oops。
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]));