3

色を取得したい単純なバイト配列があります。私の計画では、赤から 3 ビット、緑から 3 ビット、青から 2 ビットを用意することでした。8 ビット。

色は正しいと思います:

私が間違っている場合は、私を修正してください、

 byte[] colours = new byte[256]; //256 different colours, 8 * 8 * 4 
                                 //(3 bits(red) + 3 bits(green) + 2 bits(blue)
 int index = 0;
 for(byte r = 0; r < 8; r++){ 
    for(byte g = 0; g < 8; g++){
       for(byte b = 0; b < 4; b++){
           byte rr = (r & 255);
           byte gg = (g & 255);
           byte bb = (b & 255);
           colours[index++] = (rr << 5 | gg << 2 | bb);   
       }
   }
}

私の目標は、 getColor(byte r, byte g, byte b) を次のようにすることです

public static byte getColor(byte r, byte g, byte b){
    return colours[return the right color using r g b];
}

しかし、方法がわかりません。ここで助けが必要です。

可能であれば、 Color クラスを使用したくありません。

その他の情報: BufferedImage.TYPE.BYTE.INDEXED を使用してペイントしています。

私の英語が下手ならごめんなさい:)

編集 間違っていたところを修正

4

1 に答える 1

0

Javabyteは符号付きで、2 の補数で表されるため、そのようにシフトすることはできません。
128 以降では、負の値を使用してビット パターンを逆にする必要があります。

byte[] colours = new byte[256];

for(int i = 0; i < colours.length; i++){ 
    colours[i] = (byte) (i < 128 ? i : i - 256);
}

あなたの方法は、次のようなものでなければなりません:

public static byte getColour(byte r, byte g, byte b)
        throws InvalidColourException {
    if (r >= 8 || r < 0)
        throw new InvalidColourException("Red is out of range.");
    if (g >= 8 || g < 0)
        throw new InvalidColourException("Green is out of range.");
    if (b >= 4 || b < 0)
        throw new InvalidColourException("Blue is out of range.");
    int i = (int) r << 5;
    i += (int) g << 2;
    i += (int) b;
    return colours[i];
}

ただし、すべてを 1 つのメソッドに縮小して、配列を破棄することもできます。

public static byte getColour(byte r, byte g, byte b)
        throws InvalidColourException {
    if (r >= 8 || r < 0)
        throw new InvalidColourException("Red is out of range.");
    if (g >= 8 || g < 0)
        throw new InvalidColourException("Green is out of range.");
    if (b >= 4 || b < 0)
        throw new InvalidColourException("Blue is out of range.");
    int c = (int) r << 5;
    c += (int) g << 2;
    c += (int) b;
    return (byte) c;
}
于 2013-02-25T22:25:23.863 に答える