トップページ > 過去ログ > 記事閲覧
GetColorによる色取得
名前:ライブラリ使用者 日時: 2008/10/05 16:41

GetColorから返る、値が違うようです? 下記のソースで、r,g,bには255、ci_whiteにはいずれも0が入ります。 この値を使用して、描画すると黒になります。 WHITEを指定して描画すれば、白で表示されますので GetColor()内で正しくない値が返っているものと思います。 DXライブラリのソースを見たのですが、どこがそうなのかイマイチ分からず。  確認して頂けませんか? 以下のようなソースで確認 モニターで32bit/16bit設定にて、色の違いが指摘されたため、色の値をGetColor()で再取得しようとした。 #define WHITE 0xFFFFFF int r = GetRValue(WHITE); int g = GetGValue(WHITE); int b = GetBValue(WHITE); ci_white = GetColor(GetRValue(WHITE),GetGValue(WHITE),GetBValue(WHITE)); ci_white = GetColor(255,255,255);

Page: 1 |

Re: GetColorによる色取得 ( No.1 )
名前:JEX 日時:2008/10/06 12:28

上記のコードは試してないので推測で申し訳ないのですが、 0xFFFFFFではなく 0xFFFFFFFFでは? 0xFFFFFFFF ↑ α要素 のように先頭2つはα要素だったと思います。
Re: GetColorによる色取得 ( No.2 )
名前:IW 日時:2008/10/06 15:47

 その GetColor()は DxLib_Init()の前ですか? 後ですか?  あと GetRValue()って何でしょうか?
Re: GetColorによる色取得 ( No.3 )
名前:JEX 日時:2008/10/06 17:20

>IWさん 私も存在を知らなかったのですが多分 int Color = GetColor( 128, 64, 32 ) とあったとしたら GetRValue( Color )は128に GetGValue( Color )は64に GetBValue( Color )は32に とかなるような色のRGB要素を逆算するような関数なのではないでしょうか? おそらくリファレンスには無いマイナー関数なのだと思います。
Re: GetColorによる色取得 ( No.4 )
名前:JEX 日時:2008/10/06 17:37

あ、すみません。マイナー関数ではなくどうやらWinAPIで定義されているマクロのようでした。 #define GetRValue(rgb) (LOBYTE(rgb)) #define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8)) #define GetBValue(rgb) (LOBYTE((rgb)>>16)) という定義でしたが、これは多分DXライブラリのGetColorとは違い、RとBの要素が逆になったRGB定義なので GetColorで使えるようにするには #define GetRColor(rgb) GetBValue(rgb) #define GetGColor(rgb) GetGValue(rgb) #define GetBColor(rgb) GetRValue(rgb) こういうのを定義してGetRValueとかの変わりに使えばいいと思います。
Re: GetColorによる色取得 ( No.5 )
名前: 日時:2008/10/06 18:11

まず、32Bitと16Bitの色の内部表現が違うのは 分かりますか? 32BitでA8R8G8B8という形式の場合、 A:0-255 R:0-255 G:0-255 B:0-255 とういう表現範囲が可能です。 つまり、0x00000000 - 0xFFFFFFFF の範囲です しかし16Bitの場合上記の表現では表現できません。 そこで幾つかのビットを削る必要があるわけです。 アルファの表現をこれに入れてしまうと、 表現可能な色がかなり限られるので、 殆どの場合16BitではRGBのみであらわされ、 R5G6B5などの形式が使われます。(あくまで一例です) これにより、 R:0-31 G:0-63 B:0-31 という 0x0000 - 0xFFFFというような 表現範囲となったりします。 0xFFFFFFは既にこの表現範囲を超えていますね。 もちろん32Bitの0xFFFFFFFFも駄目です。 表現範囲を超えた部分については基本的に0となり それらをシフト演算などをした結果0になっている 可能性が考えられます。 このような表現範囲の違いを吸収する為に、 GetDispColorData関数あたりで現在のDisplayの カラー情報を取得し、GetColor3関数あたりで 色を取得することで解決できそうな気がします。 #どちらもマイナーですが。
Re: GetColorによる色取得 ( No.6 )
名前:ライブラリ使用者 日時:2008/10/06 23:17

IWさん クラス使ってて、コンストラクタで処理してるのでDxLib_Init()より前です。 JEXさん >DXライブラリのGetColorとは違い、RとBの要素が逆になったRGB定義 DXライブラリはRed、Blueが逆で値入っているのですか?? >32bit値使ってるようですね。。 通さん >R:0-31 G:0-63 B:0-31 このようなとこまでは存知あげませんでした。 GetColor()で吸収できるのかと思っていました(−− Displayの表示Bit取得して、GetColor3()と使い分けないといけないのですね。 それは今の段階だと、対応が大変なので(もうひとつ質問している通信のが優先なんで)とりあえず保留します。  解答ありがとうございます。 どう対応していけばいいのかは分かりました。
Re: GetColorによる色取得 ( No.7 )
名前: 日時:2008/10/07 08:14

>Displayの表示Bit取得して、 >GetColor3()と使い分けないといけないのですね。 使い分ける必要はないと思います。 ヘッダから察するに、GetDispColorData関数は 現在のDisplay情報を返してくれるようなので、 これさえ使っておけばどんな解像度にも対応した 色が取れるのではないか。。。 と思っていたのですが、こちらで試したところ、 JEXさんの書かれている問題に引っかかって 結局、そのマクロを使うと色情報の扱いが 変わってしまうのでダメのようです。 >#define GetRColor(rgb) GetBValue(rgb) >#define GetGColor(rgb) GetGValue(rgb) >#define GetBColor(rgb) GetRValue(rgb) 逆のような気がしますが、 そもそもこれを行うならば、 直接GetRColorを呼びだすほうが良いです。 余計な混乱がないと思います。 >DXライブラリはRed、Blueが >逆で値入っているのですか?? というよりは、RGBBitと ピクセルフォーマットの違いです。 上で書いた A8R8G8B8やR5G6B5とはすべて ピクセルフォーマットになります。 これはDirectXなどが使うフォーマットです。 #DXライブラリはX8R8G8B8かも。 Windows上でのRGBはVideoなどの関係で デバイスコンテキストに割り振られている、 表示用のRGBBitを使うようで、それ用の マクロだからだと思われます。 マクロを以下のようにするとうまくいくかも?#undef GetRValue #define GetRValue(argb) ((0x00FF0000&argb) >> 16) #undef GetGValue #define GetGValue(argb) ((0x0000FF00&argb) >> 8 ) #undef GetBValue #define GetBValue(argb) ((0x000000FF&argb)) わざわざundefとかしなくても別名で定義したほうが 安全ですが。
Re: GetColorによる色取得 ( No.8 )
名前:IW 日時:2008/10/07 15:12

>コンストラクタで処理してるのでDxLib_Init()より前です  前はダメです。。  Init処理の後初期化が行われ、画面の色深度などの決まりますので、 必ずInit処理の後で呼ばないと GetColorの値は正しくならないはずです。
Re: GetColorによる色取得 ( No.9 )
名前:ライブラリ使用者 日時:2008/10/07 23:57

解答ありがとうございます。 ピクセルフォーマットね。。もう少しその辺り勉強してみます。 コンストラクタじゃまずい訳ですね。 別に初期化用の関数でも設けることで対応します。

Page: 1 |