アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++で画像処理のプログラムを作成中です。
ビットマップを読み込み、1ピクセルごとに処理を施すのが目的です。
「デジタル画像処理入門」という本に

col = GetPixel(hDC1,i,j);
r = (byte)(col & 0xFF);
g = (byte)(col/0x100 & 0xFF);
b = (byte)(col/0x1000 & 0xFF);

というプログラムが載っていました。
ここで、(byte)とはどういう意味なのでしょうか?
また、(col & 0xFF)の意味はわかるのですが(col/0x100 & 0xFF)はどういう意味なのでしょうか?
例えば、colの値が0x300(10進数で258)だとすると、
col/0x100=258/256=1
となってしまうと思うのですが。
VC++のヘルプやgoogleで検索してみたのですが、わからなかったので、ここで質問させてもらいました。
お分かりの方、よろしくお願いします。

A 回答 (4件)

まずGetPixelの戻り値がCOLORREF型です。


このCOLORREFはカラー値として使われる 32 ビット値なのですが、中に赤、青、緑の各値(0~255)を持っています。
例えば(ちょっと暗い水色)B=0xFF,G=0xA0,R=0x10であれば
0x00FFA010になります。

(col/0x100 & 0xFF)はそれぞれの色の成分を抽出するためで
COL=0x00FFA010であれば、

(byte)(col & 0xFF) = 0x10
(byte)(col/0x100 & 0xFF) = 0xA0
(byte)(col/0x1000 & 0xFF) = 0xFF
になります。

ちなみに
(byte)(col/0x100 & 0xFF) = 0xA0

col/0x100 時点で 演算結果は 0x0000FFA0 になり、
その後 0xFF でANDを取ることにより
0x000000A0 のみを抽出しています。
このままだと値自体はまだ32ビットなので、
byteによって1バイトにキャスト(型変換)しています。
    • good
    • 0
この回答へのお礼

ありがとうございます。大変よくわかりましたm(__)m。

お礼日時:2005/06/20 23:53

col = GetPixel(hDC1,i,j);


r = (byte)(col & 0xFF);
g = (byte)(col>>8 & 0xFF);
b = (byte)(col>>16 & 0xFF);

普通、こういうふうにシフト演算子で書いたほうがすっきりするような・・・
ま、コンパイラが最適化してくれるんでしょうが^^;
    • good
    • 0
この回答へのお礼

ありがとうございます。自分でプログラムを書くときには使わせていただきます。

お礼日時:2005/06/20 23:49

C言語をよく知らないで、いきなり画像処理プログラムを書くというのが無理があります。


まずは、CまたはC++の入門書を読んで文法を一通り理解してからのほうが、急がば回れになると思います。
参考までに、(byte)は、型定義とか、キャストの項目に説明があるでしょう。
(col/0x100 & 0xFF)については、「(col & 0xFF)の意味はわかる」とお書きですが、これの意味がわからないということは、&演算子の意味がわかっていないか、もしくは、col/0x100が、col>>8と同じである事に気づいていないか。いずれにせよビット演算の項目をよく読みましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。キャストで引いたらわかりました。

お礼日時:2005/06/20 23:49

> colの値が0x300(10進数で258)だとすると、


> col/0x100=258/256=1となってしまうと思うのですが。

0x300は10進数で768です。
    • good
    • 0
この回答へのお礼

ありがとうございます。258は0x102でした。お恥ずかしい。
おかげさまでcol/0x100 & 0xFFの処理内容が理解できました。

お礼日時:2005/06/20 16:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!