• ベストアンサー

VC++ (byte)(col & 0xFF) の意味

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で検索してみたのですが、わからなかったので、ここで質問させてもらいました。 お分かりの方、よろしくお願いします。

  • string
  • お礼率92% (168/181)

質問者が選んだベストアンサー

  • ベストアンサー
noname#11722
noname#11722
回答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バイトにキャスト(型変換)しています。

string
質問者

お礼

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

その他の回答 (3)

  • bonyamk
  • ベストアンサー率29% (49/166)
回答No.3

col = GetPixel(hDC1,i,j); r = (byte)(col & 0xFF); g = (byte)(col>>8 & 0xFF); b = (byte)(col>>16 & 0xFF); 普通、こういうふうにシフト演算子で書いたほうがすっきりするような・・・ ま、コンパイラが最適化してくれるんでしょうが^^;

string
質問者

お礼

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

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

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

string
質問者

お礼

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

回答No.1

> colの値が0x300(10進数で258)だとすると、 > col/0x100=258/256=1となってしまうと思うのですが。 0x300は10進数で768です。

string
質問者

お礼

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

関連するQ&A

  • visual C++  画像処理における質問

    最近visual C++ で画像処理の勉強をしています。 画像濃度の取得で以下の2つの違いがわかりません。 とりあえず(1)を用いたプログラムでは、濃度取得が うまくいきませんでした。初心者ですが御回答の程 を宜しくお願い致します。 (1) col[i][j]=GetPixel(hDC1,i,j); (2) col[i][j]=(short)(GetPixel(hDC1,i,j) & 0xFF);

  • VC++ スクロールバーが何ピクセル移動したか知るには?

    VC++初心者なんですが、子ウィンドウにビットマップ画像を表示して、マウスポインタの指している位置のRGBの値を表示するプログラムを作っています。 このとき、画像がある子ウィンドウにスクロールバーがあるとき、スクロールしたあとでもマウスポインタの指すx、y座標が子ウィンドウの左上になってしまいます。そこで、何ピクセル分x、y座標方向にスクロールしたかがわかって、その分マウスポインタの位置に足せばよいと考えたのですが、何ピクセル分スクロールしたかをどう調べるかわかりません。OnHScrollとOnVScrollを用いるのかな?と思ったのですが、ヘルプを読んでもイマイチわかりません。何か変数に、どれだけx方向にスクロールしたか?y方向にスクロールしたか、を格納できるような処理があれば教えてください。

  • GetPixelに使うHDCの作り方

    ビットマップハンドルhBitmap の(x,y)の画素の色を読み取るプログラムに使うデバイスコンテキストとして、  hDC = CreateCompatibleDC(NULL);  SelectObject(hDC, hBitmap);  rgb = GetPixel(hDC, x,y);  DeleteDC(hDC); のように、NULL を指定して、画面と互換性のあるメモリデバイスコンテキストを指定したのですが、正しい色が読み出せません。hDC = GetDC(NULL);でも同じく駄目でした。hDCはどのように作ったらよいのでしょう。 なお、関数の中でGetPixel()を使いたいので、hWnd などは使えません。

  • WinAPIのGetDIBitsでディスプレイのビットを...

    CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL) で、ディスプレイのHDCを収得したのですが、その後ある一定範囲のビットを調べたいです。 しかし、GetPixelだと処理が遅くなり、困っています。 GetDIBitsはあまり解説しているサイトが少なく、よくわかりません・・・。 また、第一パラメータはHDCを指定すればいいようですが、そのあとのビットマップハンドルをなぜ指定する必要があるのでしょうか。 それと、ディスプレイのビットマップハンドルを収得できますか?

  • VC++で困ってます・・・。

    VC++で、ビットマットフォーマットをする。課題がでました。 課題は、ピクチャーボックスにbmpファイルを表示して、表示したbmpからボタンを使って、ラベルや、テキストボックスに、そのbmpのバイト数や、画像に関する、情報を表示する課題です。 今は、ピクチャーボックスから画像を出すことはできたんですが、その後にどうやって画像に関する色のバイト数や、情報を表示するかわかりません。 どこを、いじってプログラムを作っていくかもわからない状況です。 初心者なんで、プログラムの例や、ビットマップファイルに使うプログラムとかいろいろ教えてください。

  • VC++でシューティングゲームを作っているのですが・・・

    下のコードをビルドすると、 自分の意図としては、ウィンドウの左上に自機ビットマップが表示されてほしいのですが、 真っ黒な画面になってしまいます。 正確に言うと、背景が黒、自機ビットマップの画像が真っ黒、自機ビットマップの領域にあたる四角が白くなります。 症状に見当がつかないので、手を貸して頂きたいです。 よろしくお願いします。 ちなみに、wc.hdrBackgroundは(HBRUSH)(COLOR_WINDOW+1)となっています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; static RECT sizeWnd; static HDC hDC; PAINTSTRUCT ps; static HDC hMemDC; static HBITMAP hMemBmp; static HDC hMjDC; static HBITMAP hMjBmp; static BITMAP infoMjBmp; static POINT posMj; static int flagMjShot; static POINT posMjShot; switch (message) { case WM_CREATE: GetClientRect(hWnd, &sizeWnd); // クライアント領域の大きさをsizeWndに格納 // フロントバッファの初期処理 hDC = GetDC(hWnd); // バックバッファの初期処理 hMemDC = CreateCompatibleDC(hDC); // hDCと互換性をとるメモリデバイスコンテキストhMemDCを構築 hMemBmp = CreateCompatibleBitmap(hMemDC, sizeWnd.right, sizeWnd.bottom); // hMemDCと互換性のあるビットマップhMemBmpをsizeWndの大きさで生成 SelectObject(hMemDC, hMemBmp); // 自機ビットマップの初期処理 hMjDC = CreateCompatibleDC(hMemDC); // hMemDCと互換性をとるメモリデバイスコンテキストhMjDCを構築 hMjBmp = (HBITMAP)LoadImage( // ビットマップイメージMYJET(リソース)をhMjBmpに設定 (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDB_MYJET), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR ); SelectObject(hMjDC, hMjBmp); // hMjDCにhMjBmpを設定 GetObject(hMjBmp, sizeof(BITMAP), &infoMjBmp); // hMjBmpのビットマップ情報をBITMAP構造体infoMjBmpに格納 SetTimer(hWnd, 1, 10, NULL); // 100分の1秒毎にWM_TIMERメッセージを送るタイマー1をセット break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); // hDCにディスプレイのデバイスコンテキストのハンドルを格納 BitBlt( // hDCにバックバッファhMemDCを転送 hDC, 0, 0, sizeWnd.right, sizeWnd.bottom, hMemDC, 0, 0, SRCCOPY ); EndPaint(hWnd, &ps); break; case WM_TIMER: // 一定時間毎の処理 // 自機ビットマップをバックバッファhMemDCに描画 StretchBlt( // hMjDCを、posMjを左上の座標として縦横を3倍に引き伸ばしてhMemDCに転送 hMemDC, posMj.x, posMj.y, infoMjBmp.bmWidth * 3, infoMjBmp.bmHeight * 3, hMjDC, 0, 0, infoMjBmp.bmWidth, infoMjBmp.bmHeight, SRCCOPY ); InvalidateRect(hWnd, NULL, FALSE); break;

  • VC++ 6.0 でJPEGをBMPに変換したい…

    VC++ 6.0を用いて画像処理のプログラミングをしています。 プログラムでJPEGを読み込んで、BMPに変換して画像処理をした後、JPEGもしくはBMP、どちらでも保存できるようにできればいいと思い、Webをいろいろ探してみたところ、IJGのjpeg-6bというものを見つけました。これをコンパイルして、libjpeg.libほか、多数の実行ファイルにすることができたのですが、ここからVC++ 6.0で使う方法がまったくわかりません。そもそもライブラリとは何なのか分かっていません。VC++を始めて数ヶ月ですので具体的に教えてください。また、もっといい方法があればそちらの方も教えてください。

  • VC++6.0 Stack Overflow !!

    私はVC++6.0で画像処理のプログラムを作っています。 再帰構造を用いたある関数を呼ぶと、対象の画像によって、スタックオーバーフローでプログラムが止まってしまいます。 これを避ける方法や、スタックのサイズの変更方法がありましたら教えてください。 なお、現在、VC++のメニューの「プロジェクト」→「設定」→「リンク」タブ→「アウトプット」カテゴリからスタックアロケーションの予約のところを適当な大きな数を入力しているのですが、効果はありません。

  • Excel2003VBAでクリップボードにあるビットマップの操作について

    Excel2003VBAにおいてクリップボードにあるビットマップの画像の任意の1pxの色を、 ペイントのスポイトツールのように取得するマクロを作成したいのですが GetPixelという関数で画像の任意1pxの色を取得できる所までは調べられたのですが、 それをクリップボードの画像で使用することができませんでした。 以下は、GetPixel関数を試してみた時のソースになります。 '------------------------------------------------------------------ Option Explicit Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub ピクセル色獲得() Dim hwnd As Long Dim hdc As Long hwnd = GetDesktopWindow() hdc = GetWindowDC(hwnd) Debug.Print Hex(GetPixel(hdc, 100, 200)) End Sub '------------------------------------------------------------------ 上記ソースで任意1pxの色を取得できたため クリップボードの画像の色を取得するマクロを下記のように作成しました。 '--------------------------------------------------------------- Option Explicit Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub クリップボードピクセル色獲得() Dim CB As Variant Dim i As Long CB = Application.ClipboardFormats Debug.Print Hex(GetPixel(CB, 100, 200)) End Sub '--------------------------------------------------------------- 型が一致しません と言われ動きません。 以上です、よろしくお願いいたします。

  • スクリーンの画像をメモリに読み込みたい

    今、スクリーンに表示されている画像をそのままメモリに読み込んで ピクセル毎に演算処理をするようなプログラムを書きたいのですが どうすればいいでしょうか。 できれば、なるべく高速な方法がいいです。 ちなみにVC++2005です。 宜しくお願いします。