2

我想交换一个像素的红色和蓝色值。应该执行此操作的方法接收作为 int 0xAARRGGBB 的像素,其中 AA 是 alpha 的十六进制值,颜色为 r、g、b,例如完全不透明的蓝色为 0xFF0000FF。

我将值转换为字符串,然后使用 substring() 将其剪切,以修改后的顺序将其拼接在一起并将结果转换回 int。这似乎不雅且不起作用:

public int filterRGB(int x, int y, int pixel) {

    int filteredPixel;
    String s, a, r, g, b, res;
        s = Integer.toString(pixel);            
        a = s.substring(2,4);//alpha                
        r = s.substring(4,6);//r
        g = s.substring(6,8);//g
        b = s.substring(8,10);//b

    res = "0x" + a + b + g + r;
    filteredPixel = Integer.parseInt(res);

    return filteredPixel;

它不起作用的原因似乎是 substring(8,10)。该行之后的代码不会被执行。它确实适用于 substring(8,9),但这会切断蓝调的第二个十六进制值。我不知道如何自己查找,所以,请有人解释一下吗?

4

1 回答 1

3

如果你更换

s = Integer.toString(pixel);

s = Integer.toString(pixel, 16);
a = s.substring(0,2);//alpha
r = s.substring(2,4);//r
g = s.substring(4,6);//g
b = s.substring(6,8);//b

你的方法应该有效。

但是,更好的方法是使用位算术和移位来执行重新排列:

int a = (pixel >>> 24) & 0xFF;
int r = (pixel >>> 16) & 0xFF;
int g = (pixel >>>  8) & 0xFF;
int b = (pixel >>>  0) & 0xFF;

int filteredPixel = (a << 24) | (b << 16) | (g << 8) || (r << 0);
于 2012-11-02T04:31:25.703 回答