A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんばんは。
御礼頂きました。>>その内容はDDBになっていると思うのですが、これを直接操作することはできないのでしょうか?
はい。
残念ながらも、DDBからグラフィックスのポインタを取り出す事は出来ないのです(ただ、Vistaではどうか分かりません・・・)。
実験として、以下を実行して、bitmap.bmBits メンバを確認して見ると良いでしょう。
ココがNULLであった場合、グラフィックスへのポインタが取れなかった事を意味します。
もしVistaに置いて、認められているのであるならば、グラフィックスへのポインタが帰って来る筈です。
BITMAP bitmap = {0};
::GetObject(hBitmap, sizeof(bitmap), &bitmap);
>>DIBに変換しなければならないのでしょうか?
はい。
直にグラフィックスのポインタへアクセスする為には、「DIBへの変換が必要」と言う事に成ります。
此れに関しては、幾つかの選択肢が有りますが、手っ取り早くDIBのビットマップハンドルを作成する事でしょうか。
DIBのヘッダの初期化が面倒程度で、左程難しい事は有りません。
DIBを作成し、DDBからDIBに向かってBitBlt()API等で描写すれば、互換コピーが出来ます。後はDIBに対してお目当ての処理をするだけです。
例えば、こんな感じです。
※InitHDR32BIT()/InitBitFields32BIT()は参考URLのNo3を引用
//DDBからDIBへの互換コピー
static HBITMAP ConvertToDIB(HBITMAP hDDB)
{
//変換元DDBの情報を取る
BITMAP bitmap = {0};
::GetObject(hDDB, sizeof(bitmap), &bitmap);
//ヘッダのサイズ(RGBQUAD * 3は、ビットフィールド用に必要です)
const int nHDRSize = sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) * 3);
LPBITMAPINFO pbmi = static_cast<LPBITMAPINFO>(::calloc(nHDRSize, 1));
//32ビット用のヘッダを作成する
::InitHDR32BIT(pbmi->bmiHeader, bitmap.bmWidth, bitmap.bmHeight);
//32ビット用のフィールドを設定する
::InitBitFields32BIT(pbmi->bmiColors);
//DIBセクションの作成
LPVOID pBits = NULL;
HBITMAP hDIB = ::CreateDIBSection(NULL, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL);
//動的に割り当てたヘッダを解放する
::free(pbmi);
//DIB用HDC
HDC hDCDIB = ::CreateCompatibleDC(NULL);
//DDB用HDC
HDC hDCDDB = ::CreateCompatibleDC(NULL);
//それぞれをHDCに選択
::SelectObject(hDCDIB, hDIB);
::SelectObject(hDCDDB, hDDB);
//DDBからDIBへ互換コピー
::BitBlt(hDCDIB, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hDCDDB, 0, 0, SRCCOPY);
//それぞれのHDCを解放
::DeleteDC(hDCDIB);
::DeleteDC(hDCDDB);
//出来上がり
return hDIB;
}
//この様にして変換する
HBITMAP hDIB = ::ConvertToDIB(hBitmap/*お目当てのDDB*/);
::GetObject(hDIB, sizeof(bitmap), &bitmap);
//ココでグラフィックのポインタが取れる筈
bitmap.bmBits
その他、例えば、2Dグラフィックス系で言えば、DirectDrawやDirect3Dのテクスチャ等がありますが、何れも「ビデオメモリ側」と「システムメモリ側」に分かれており、グラフィックスのポインタを取り出して処理する際には、「ビデオメモリ側からシステムメモリ側へ互換複写」をした後、システムメモリ側のモノを操作する、と言った事に成ります(勿論、編集後はシステムメモリ側からビデオメモリ側へ複写しなおす)。
そう言った意味では、似たり寄ったりだと思います。
No.1
- 回答日時:
こんにちは。
SetPixel()/GetPixel()はどうしようもない程重たい物です。
高速化を計るのであるならば、DIBイメージにして、グラフィックデータへのポインタにアクセスするのが手っ取り早いと思います。
また、プログラム内にて、取り扱うフォーマットを決めておかないと大変な事になってしまいます(32ビットを前提にすると楽です)。
以下のリンクは似た様な事例です。
http://oshiete1.goo.ne.jp/qa4431353.html
ご回答ありがとうございます。
質問ですがスクリーン画面のビットマップ構造体を取得したとき、その内容はDDBになっていると思うのですが、
これを直接操作することはできないのでしょうか?
DIBに変換しなければならないのでしょうか?
画像処理についての知識が全くないので的外れな質問かもしれませんがよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
ロボットの住む世界で流行ってる罰ゲームとは?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
GetPixelに使うHDCの作り方
C言語・C++・C#
-
WinAPIのGetDIBitsでディスプレイのビットを...
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
init関数の意味
-
CImage GetBitsメソッドについて
-
Run-Time Check Failure #3とい...
-
ポインタのミスでOS壊れるの...
-
C言語によるメモリ読み書き
-
DelphiでCreateProcessがうまく...
-
無効なポインタ操作のエラー
-
fopne で失敗する原因
-
関数から配列を返すには?
-
C言語にて構造体のメンバがNULL...
-
配列の要素数に変数を入れたい...
-
VB.NETでテキストボックスをコ...
-
C# ポインタ アクセス違反
-
C言語 配列の長さの上限
-
10個の整数を入力して小さい順...
-
VB6 任意の順番でのソート
-
C++Builder 2009 テキスト...
-
配列の問題
-
Excelですべての組合せ(重複組...
-
構造体のデータを丸ごとコピー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
init関数の意味
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
C言語でのconstを返す関数
-
ハンドルはポインタか
-
PASCALとFARの意味
-
ハンドル、アドレス、ポインタ...
-
CWnd::EnableWindow()の扱い方
-
デバイスハンドルとは?
-
ポインタについて
-
C言語の文字列?処理 strcpyやl...
-
ポインタのミスでOS壊れるの...
-
C++ vectorのbeginについて
-
どうしてエラーになるかわかり...
おすすめ情報