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で検索してみたのですが、わからなかったので、ここで質問させてもらいました。
お分かりの方、よろしくお願いします。
No.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バイトにキャスト(型変換)しています。
No.3
- 回答日時:
col = GetPixel(hDC1,i,j);
r = (byte)(col & 0xFF);
g = (byte)(col>>8 & 0xFF);
b = (byte)(col>>16 & 0xFF);
普通、こういうふうにシフト演算子で書いたほうがすっきりするような・・・
ま、コンパイラが最適化してくれるんでしょうが^^;
No.2
- 回答日時:
C言語をよく知らないで、いきなり画像処理プログラムを書くというのが無理があります。
まずは、CまたはC++の入門書を読んで文法を一通り理解してからのほうが、急がば回れになると思います。
参考までに、(byte)は、型定義とか、キャストの項目に説明があるでしょう。
(col/0x100 & 0xFF)については、「(col & 0xFF)の意味はわかる」とお書きですが、これの意味がわからないということは、&演算子の意味がわかっていないか、もしくは、col/0x100が、col>>8と同じである事に気づいていないか。いずれにせよビット演算の項目をよく読みましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(コンピューター・テクノロジー) Pythonの np.indicesに関する質問です。 2 2023/02/07 08:19
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) Excelでこの式の意味をおしえていただけますでしょうか、またどのように理解したらいいのでしょうか 3 2022/11/18 00:11
- 統計学 標本平均の分布 9 2022/06/08 09:47
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二点の座標から距離や角度を求...
-
VBAにおけるニュートン法
-
一行飛ばしで合計
-
Functionの戻り値を配列にした...
-
チェックボックスを操作できな...
-
C言語のサフィックスについて
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
他のフォームから別のフォーム...
-
マクロ 条件式
-
【VB6.0】 あるフォームから他...
-
リストビューの列ヘッダーの幅...
-
【VBScript】変数のスコープ
-
VB.NETでのイベントの途中終了
-
verilogのcase文
-
アクセスできない保護レベルエ...
-
VBAでcallで呼び出したsubを終...
-
SavePictureで保存できない
-
ボールが壁に当たって跳ね返る...
-
VB
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル・VBAでテキストボック...
-
二点の座標から距離や角度を求...
-
VB.NET)コンボボックスの連動に...
-
VC++ (byte)(col & 0xFF) の意味
-
複数条件のオートフィルタ(VBA)
-
検索結果の指定列をリストボッ...
-
線の太さ
-
テキストファイルの読み込みと...
-
VBAにおけるニュートン法
-
2次元配列を返す関数について
-
for文の質問です。
-
4変数の非線形方程式のときかた
-
エクセル ユーザーフォーム ...
-
ドラゴン曲線を再帰で書く
-
VC++2010 大きい桁数をBYTE型配...
-
sublimit textっていうエディタ...
-
エクセルVBAでテキストボッ...
-
VBA public変数はどのようなこ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
おすすめ情報