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
なるほど。私も参考になりました。
ありがとうございます。
|