- ベストアンサー
CopyMemory()をmemcpy()に書き換える方法
読み込んだBMP画像をテスクチャに転送しようとしています。 CopyMemory(lpPixel + j + i * iWidth, lpBMPPixel + j*3 + i * iLength, 3); の第二引数から memcpy((BYTE*)LockedRect.pBits + LockedRect.Pitch*i +4*j, &Color, sizeof(DWORD)); の第一引数へ入れたいのですが、 CopyMemory()は LPDWORD型のlpPixelに数値を足して指したメモリブロックに対して、 LPBYTE型のlpBMPPixelに数値を足して(?)指したメモリブロックの情報を 3バイトずつ転送している事。 memcpy()は pBits=テスクチャのメモリブロックの始点 Pitch=テスクチャ1行分のメモリの長さ(改行保障値)で指定したアドレスに DWORD型のColorを直接のデータとして書き込んでいる。 という事まではわかったのですが CopyMemory()側の第二引数 lpBMPPixel + j*3 + i * iLength, から色情報を取り出そうと、型変換したりポインタで受け取ろうとしてみたのですが、 上手く行きませんでした。 ヒント程度で構いませんので、何か教えて頂けると幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これじゃだめだったということですか memcpy(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3); CopyMemory(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3); テクスチャのフォーマットはD3DFMT_X8R8G8B8に設定してありますか
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 >>CopyMemory()側の第二引数 lpBMPPixel + j*3 + i * iLength, >>から色情報を取り出そうと、型変換したりポインタで受け取ろうとしてみたのですが、 >>上手く行きませんでした。 const int pos = (j * 3) + (i * iLength); const BYTE B = lpBMPPixel[pos]; const BYTE G = lpBMPPixel[pos + 1]; const BYTE R = lpBMPPixel[pos + 2]; では駄目でしょうか? 一応此れも画像処理の一つなので、手書きで代入する事をお勧めします。 場合によっては色素の赤と青を逆に組み替えてコピーしなければいけない様な事もあり、CopyMemory()やmemcpy()の様なモノで一気にコピーしてしまうと、表示がおかしくなったり、色素の確認に梃子摺ったりする事になります。 前後関係が不明瞭である為、以下で上手くいくかは分かりませんが、参考程度に。 for(int y = 0; y < height ; ++y) { for(int x = 0; x < width; ++x) { //24bitビットマップの読み込む位置 const int bmpPos = (iLength * y) + (x * 3); //32bitテクスチャの書き込む位置 const int texPos = (LockedRect.Pitch * y) + (x * 4); //もし逆転しているならば //const int texPos = (LockedRect.Pitch * (height - 1 - y)) + (x * 4); LPBYTE pTexture = ((LPBYTE)LockedRect.pBits) + pos; //青 pTexture[texPos] = lpBMPPixel[bmpPos]; //緑 pTexture[texPos + 1] = lpBMPPixel[bmpPos + 1]; //赤 pTexture[texPos + 2] = lpBMPPixel[bmpPos + 2]; //もしARGB32bitならばアルファを設定する //pTexture[texPos + 3] = 0xff; } }
お礼
反応が遅くなって申し訳ありません。 #1の方のご助言とそちらの //もし逆転しているならば の節で直接転送して表示する事は出来たのですが、 やはりちゃんと色素を操作できるようにしたく 頂いた助言を何度も読み直して試していました。 おかげで、ARGB全てを操作可能にして転送する事が出来るようになりましたっ 丁寧な説明&豊富なヒントありがとうございます。 感謝!
お礼
ありがとうございます >memcpy(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3); のままではエラーだったので(BYTE*)にしてみて、 テスクチャフォーマットの方を D3DFMT_A8R8G8B8 → D3DFMT_X8R8G8B8 にしたら表示してくれました。 ひっくり返ってますがあとは自力でなんとかやってみようと思います。 アルファの部分にFF(256)を埋め込む方法も探していたのでほんとに助かりました。 ありがとうございますっ