トップページ > 過去ログ > 記事閲覧
GetPixelの戻り値について
名前:TKSZ 日時: 2007/02/07 15:34

管理人さん、こんにちは。 DXライブラリには、いつもお世話になっています。 WindowAPIやMFC、DirectXが上手に使えない自分にとって、 最高のライブラリだと思っています。 ところで、現在並行してアクションゲームの作成中なのです。 しかし、ある問題が発生しました。 int GetPixel( int x , int y ) ; を使って色の判定を行おうとしているのですが、 GetPixelの戻り値をRGBの値に変換するには、どうすればいいのでしょうか? 実際に調べてみたら、23243という値が返ってきました。

Page: 1 |

Re: GetPixelの戻り値について ( No.1 )
名前:wiz 日時:2007/02/07 18:28

PixleFromatによるのかな。。。 こんな感じ。。。? void AnalysisColor( int src, int* a, int*r, int* g, int* b ) { //A8R8G8B8を想定 *a = (src>>24&0xFF); *r = ((src>>16)&0xFF); *g = ((src>>8)&0xFF); } テキトーだなぁ。。。(==; 参考になればいいか。。。
Re: GetPixelの戻り値について ( No.2 )
名前:wiz 日時:2007/02/07 18:32

bワスレテタ。 void AnalysisColor( int src, int* a, int* r, int* g, int* b ) { //A8R8G8B8を想定 *a = (src>>24&0xFF); *r = ((src>>16)&0xFF); *g = ((src>>8)&0xFF); *b = (src&0xFF); }
Re: GetPixelの戻り値について ( No.3 )
名前:TKSZ 日時:2007/02/07 19:18

ありがとうございます。wizさん。 シフト演算を使うのですね。 大変参考になりました。
Re: GetPixelの戻り値について ( No.4 )
名前:SweetBlack 日時:2007/02/08 00:28

勝手に補足。 32bitカラーならwizさんの通りですけど 16bitカラーの場合は RRRRRGGGGG?BBBBB って感じのようですね。 GetColor命令では各色0〜255となってますが 16bitカラーの場合はそれを8で割って0〜31としてるみたいです。 この場合のRGBの求め方はwizさんのを流用させていただくと *r = ((Cr>>11)&0x1F) * 8 ; *g = ((Cr>>6)&0x1F) * 8 ; *b = (Cr&0x1F) * 8 ; となるのかな?
Re: GetPixelの戻り値について ( No.5 )
名前:TKSZ 日時:2007/02/08 02:10

>>SweetBlackさん なるほど、画面モードに応じて、処理を 切り替える必要があるということですね。 wizさんも、SweetBlackさんもよく知っていますね。 ありがとうございます。 これで、なんとかなりそうです。
Re: GetPixelの戻り値について ( No.6 )
名前:wis 日時:2007/02/08 03:19

あと注意が要るのは、32BitでもARGBの配置が違う場合、R8G8B8A8とか。 初期化するときのFormatってどうやってるか見てないけどDXライブラリの初期化時は指定はできないのかな?? DXのモードを取得できれば解決。 >16bitカラー たしか16Bitだと R5G6B5 A1R5G5B5 とかあったきがしますね。。。 独り言でした。
Re: GetPixelの戻り値について ( No.7 )
名前:SweetBlack 日時:2007/02/08 08:55

TKSZさんの質問を見てから自分で調べました。 私はARGB(32ビット)の事を全然知らなくて wizさんの書き込みをみて初めて気づいたわけですが。 まぁ少なくとも16ビットの場合は、 「8ビット(0〜255)を8で割って5ビット(0〜31)にしている」 って事は間違い無いので GetColor(8,0,0)でビットが経ったのがRの最下位ビット、 GetColor(0,8,0)でビットが経ったのがGの最下位ビット、 GetColor(0,0,8)でビットが経ったのがBの最下位ビット、 と判断しました。 (こうすればFormat取得できませんかね) ただ、GetColor(0,255,0)とすると、0000011111100000となったので、 wisさんのおっしゃるR5G6B5なのかもしれません。 でも、GetPixelで取得したカラーをRGB分解するだけなら 無視しても問題ないなぁと思いました。 以上、私も独り言。
Re: GetPixelの戻り値について ( No.8 )
名前:管理人 日時:2007/02/08 14:04

 TKSZさん始めまして、DXライブラリの管理人です。  非公開の関数に // 画面モードに対応した色データ値から個々の3原色データを抜き出す int GetColor2( int Color, int *Red, int *Green, int *Blue ) ;  という関数があります。  こちらの関数の第一引数に GetPixel の戻り値のカラーコードを渡すと、 Red Green Blue でアドレスを渡した変数に0〜255の値が格納されます。 int color, r, g, b; color = GetPixel( 0, 0 ); GetColor2( color, &r, &g, &b );  ただ、画面モードが16ビットカラーの場合、RGBの各色の解像度は 32段階(Gだけ64段階)となり、画像ファイルでの色の値とは微妙に 異なる値になりますので注意してください。(最大で±8の誤差が発生します) 例:  画像ファイル時   R=254 G=125 B=59  16ビットカラー画面のGetPixel+GetColor2時   R=255 G=125 B=57 > wizさん、SweetBlackさん  DXライブラリでは 16bitカラー画面 R5G6B5 又は X1R5G5B5 (大抵R5G6B5ですが、どちらになるかはデバイスドライバ次第です) 32bitカラー画面 X8R8G8B8  となっています。
Re: GetPixelの戻り値について ( No.9 )
名前:TKSZ 日時:2007/02/08 17:58

>>管理人さん GetColor2という関数を使えば、誤差は 出るものの、簡単にRGB値が求まるんですね。 ありがとうございます。
Re: GetPixelの戻り値について ( No.10 )
名前:uk 日時:2007/02/08 23:13

なるほど。私も参考になりました。 ありがとうございます。

Page: 1 |