1

RGB カラーを 8 ビットから 6 ビットに量子化したいと考えています。私は次のようにJavaコードを書きました:

int ind = 0;
for(int y = 0; y < height; y++){    
    for(int x = 0; x < width; x++){ 
        byte a = 0;
        byte r = bytes[ind];
        byte g = bytes[ind+height*width];
        byte b = bytes[ind+height*width*2]; 

        int pix = 0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
        img.setRGB(x,y,pix);
        ind++;
    }
}

次に、次のように変更しました。

int pix = 0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);

に:

int pix = 0xff000000 | ((r & 0xff) << 12) | ((g & 0xff) << 6) | (b & 0xff);

チャンネルごとにピクセルごとに6ビットを意味すると思うので、私の理解が正しいか間違っているかはわかりません。出力画像は本当に奇妙です。誰かがそれを理解するのを手伝ってくれることを願っています

4

1 に答える 1

0

ここには 2 つの問題があります。

  1. R、G、B コンポーネントに正しくアクセスしているかどうか、および
  2. コンポーネントを正しく組み合わせているかどうか。

あなたの訪問コードはちょっと変なので、私はそれを保証することはできませんが、これは簡単に修正できるはずです: あなたのコードは画像をグレースケールにするのに機能しますか? そうでない場合は、それを修正することから始めます。

ここで、8 ビット チャネルを 6 ビット チャネルに変換するコードが正しくないように見えます。バイト値と 0xff の AND 演算を行っていますが、これは無意味であり、OR 演算を行う前にこれらの値を 6 ビットに縮小することに失敗しています。6 ビットに縮小するには、右に 2 シフトします。したがって、次のようなものが必要だと思います。

r >>= 2;
g >>= 2;
b >>= 2;
int pix = (r << 12) | (g << 6) | b;
于 2015-02-04T10:02:40.037 に答える