将RGB值转换为整数

55

BufferedImage中,您会收到一个包含RGB值的单个整数。到目前为止,我使用以下方法从中获取RGB值:

// rgbs is an array of integers, every single integer represents the
// RGB values combined in some way
int r = (int) ((Math.pow(256,3) + rgbs[k]) / 65536);
int g = (int) (((Math.pow(256,3) + rgbs[k]) / 256 ) % 256 );
int b = (int) ((Math.pow(256,3) + rgbs[k]) % 256);

到目前为止,这个代码是可行的。

我需要做的是弄清如何获得一个整数,以便我可以使用BufferedImage.setRGB(),因为它需要与给我的相同类型的数据。

5个回答

111
我认为代码大致如下:
int rgb = red;
rgb = (rgb << 8) + green;
rgb = (rgb << 8) + blue;

此外,我相信您可以使用以下方式获取单个值:

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

我认为在第二和第三行中不需要int。第三行应该是“rgb = ...”,对吗? - Rahat Ahmed
嗯,我认为这取决于颜色深度。你的例子对我来说看起来像是24位颜色(每个通道8位)- BufferedImage期望的是这样吗? - Matt Ball
你的第一个代码示例中,红色、绿色和蓝色的值分别是多少? - Golden Lion
@GoldenLion,它们是您的红/绿/蓝值中每个单独的0-255值。在问题中,r/g/b被用作变量名。 - camickr
def colorValue(value): retVal=((value[0]&0x0ff)<<16)|((value[1]&0x0ff)<<8)|(value[2]&0x0ff) return retVal 如果我传入 (255,120,111),我会得到正确的值吗? - Golden Lion
显示剩余2条评论

36
int rgb = ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff);

如果您知道 r、g 和 b 值永远不会大于 255 或小于 0,那么您就不需要使用 &0x0ff。

此外

int red = (rgb>>16)&0x0ff;
int green=(rgb>>8) &0x0ff;
int blue= (rgb)    &0x0ff;

不需要乘法。


30

如果 r、g、b 分别是 0 到 255 之间的三个整数值,表示每种颜色

那么

rgb = 65536 * r + 256 * g + b;

单个 RGB 值是 r、g、b 组合的复合值,共有 16777216 种可能的色调。


2
为了提高可读性,我会将其修改为 rgb = 0xFFFF * r + 0xFF * g + b; - Mr. Polywhirl
3
0xFF = 255。必须是0x100。同样适用于0XFFFF。 - geoxile
1
谢谢这个简单而优美的公式……救了我的一天:D - Bms bharadwaj

28
int rgb = new Color(r, g, b).getRGB();

6

要获取单个颜色值,您可以像以下示例一样使用Color来处理像素(x,y)。

import java.awt.Color;
import java.awt.image.BufferedImage;

Color c = new Color(buffOriginalImage.getRGB(x,y));
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();

以上代码将给出红、绿、蓝三种颜色的整数值,范围在0到255之间。

要从RGB设置值,可以通过以下方式进行:

Color myColour = new Color(red, green, blue);
int rgb = myColour.getRGB();

//Change the pixel at (x,y) ti rgb value
image.setRGB(x, y, rgb);

请注意,上述更改修改了单个像素的值。因此,如果您需要改变整个图像的值,可能需要使用两个for循环对图像进行迭代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接