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