2

ピクセルの赤と青の色の値を交換したいと思います。これを行うメソッドは、ピクセルを int 0xAARRGGBB として受け取ります。ここで、AA はアルファの 16 進値、色の 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) で動作しますが、それはブルースの 2 番目の 16 進数値をカットします。自分で調べても分からないので、どなたか教えていただけないでしょうか?

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 に答える