2017-02-11 3 views
0

さて、私は希望の結果を返すのが難しい方法があります。だから私はテスト結果を出して、私が期待していなかった結果を返しています。ここでC - RGBA変換で目的のRGB結果が返されない

は一例である - >

int color = 0x00FFFF00; 

return 0xFF & (color >> 24) | 0xFF & (color >> 16) | 0xFF & (color >> 8); 

私が知っているから、これは返す必要があります:

0x00FFFF 

をしかし、それは実際に返されます。

0x0000FF 

をできる人してください何が起きているのか説明してください。また、32ビットRGBA整数を24ビットRGB整数に正しく変換する方法も知っています。ありがとうございます。

+0

あなたが適用されます&シフト0xFFしたがって貴重なバイトは1つしかなく、他のバイトはゼロです。 –

+0

私は知っています。私はRGBA整数内の特定の色の値を取得し、RGB整数にキャストしようとしていましたが、クリアライトはすでにこの1つで私を助けました。私は何とか私がここで間違っていたものを見る。私は赤と緑の要素の結果をRGB整数に合わせてシフトしていたはずです。 – SoleCore

答えて

0

これを試してみてください:

#include <stdio.h> 
int main() { 

     unsigned int x = 0x00FFFF00; 
     printf("0%8.8x", (x >> 8) & 0x00FFFFFF); 
} 

$ cc -o shft shft.c 
$ ./shft 
0x0000ffff 

あなたが作る場合、それはより良いです色unsigned int、 そうすることができます符号ビットが左サイドからのシフトを得るが、この場合には、我々はバイト単位でシフトマスクオフしていますそれには注意してください。

1

また、私が間違っていたことを捉えました。それぞれの上に、私はRGBの整数を一致させるためにキャストした整数の赤と緑の要素をシフトしていなかった--->ここ

int color = 0x00FFFF00; 

// Returns 0x0000FF 
return 0xFF & (color >> 24) | 0xFF & (color >> 16) | 0xFF & (color >> 8); 

は固定コードである--->

unsigned int color = 0x00FFFF00; // Unsigned Integer to avoid shifting the Two's Complement flag into the RGB value as clearlight pointed out. 

// Returns 0x00FFFF 
return (0xFF & (color >> 24)) << 16 | (0xFF & (color >> 16)) << 8 | 0xFF & (color >> 8); 
関連する問題