前提・実現したいこと
クリップボードから画像データを取得し、画像上のあるピクセルの色情報を抜き出せるようにしたい。
- クリップボードにBMP形式で抜き出せる画像をコピー(抜き出せる と書きましたができない画像データが有るか無いかも分かりません)
- プログラムでクリップボードの情報を読み出す
- 要素単位にピクセル単位のRGB情報を持った2次元配列で画像データを取得[質問箇所]
- ある1ピクセルの色を取り出す
上記のことをしたいのですが、[質問箇所]の処理がうまく行えません。
ビットマップイメージの扱いについて知識がほぼ無い状態で進めているためまるで的外れな事を書いているかも知れないですが指摘していただければ大変助かります。
よろしくお願いいたします。
該当のソースコード
c++
1 // クリップボードからDIBを取得 2 if (!::OpenClipboard(NULL)) return; 3 HANDLE hData = ::GetClipboardData(CF_DIB); 4 5 if (hData == NULL) { 6 ::CloseClipboard(); 7 return; 8 } 9 10 HANDLE *hDib = (HANDLE *)GlobalLock(hData); 11 12 ::GlobalUnlock(hData); 13 ::CloseClipboard(); 14 15 BITMAPINFOHEADER bitHead; 16 memcpy(&bitHead, hDib, sizeof(BITMAPINFOHEADER)); // BITMAPINFOHEADERを取得 17 18 if (bitHead.biBitCount != 32) { 19 // 念のため32bit画像じゃなければ抜け 20 ::GlobalFree(hData); 21 return; 22 } 23 // ピクセルごとの色情報を取りたい 24 int bitFieldMask = 12; 25 void* beginBMPData = &bitHead + bitHead.biSize + bitFieldMask; // 画像のビット情報の開始アドレス 26 int width = bitHead.biWidth, height = bitHead.biHeight, bitCnt = bitHead.biBitCount; 27 std::vector< std::vector< RGBQUAD>> picData; // RGBQUAD構造体の動的2次元配列 28 29 std::vector< RGBQUAD> picRow; 30 RGBQUAD* curPnt; // 現在指しているポインタ 31 for (int h = height -1 ; h >= 0; --h) { // 左下から右上へ並ぶデータを左上から右下へ並び変えつつ取得 32 curPnt = (RGBQUAD *)beginBMPData + (width * (h-1) * sizeof(RGBQUAD)); 33 34 picRow.clear(); 35 36 for (int w = 0; w < width; ++w) { 37 RGBQUAD tmp; 38 memcpy(&tmp, curPnt, sizeof(RGBQUAD)); 39 picRow.push_back(tmp); 40 41 curPnt += sizeof(RGBQUAD); 42 } 43 44 picData.push_back(picRow); // 何かしら値は取れているが同じデータをMSPaintにペーストして見比べると同じ座標のRGB値が違う 45 } 46 47 48 ::GlobalFree(hData);
補足情報(FW/ツールのバージョンなど)
- Windows7/64bit SP1
- VisualStudio2015SP
- VC++/MFC
参考情報
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/01 02:03