読み込んだ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,
から色情報を取り出そうと、型変換したりポインタで受け取ろうとしてみたのですが、
上手く行きませんでした。
ヒント程度で構いませんので、何か教えて頂けると幸いです。
No.1ベストアンサー
- 回答日時:
これじゃだめだったということですか
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に設定してありますか
ありがとうございます
>memcpy(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3);
のままではエラーだったので(BYTE*)にしてみて、
テスクチャフォーマットの方を
D3DFMT_A8R8G8B8 → D3DFMT_X8R8G8B8
にしたら表示してくれました。
ひっくり返ってますがあとは自力でなんとかやってみようと思います。
アルファの部分にFF(256)を埋め込む方法も探していたのでほんとに助かりました。
ありがとうございますっ
No.2
- 回答日時:
こんにちは。
>>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全てを操作可能にして転送する事が出来るようになりましたっ
丁寧な説明&豊富なヒントありがとうございます。
感謝!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Ruby 【メモリ不足で落ちる(python)】 1 2022/05/26 21:22
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- Excel(エクセル) セルを数式で指定する方法 5 2022/04/13 16:55
- Android(アンドロイド) galaxy s8+にUSBメモリ(type-c)を接続し、動画再生すると熱くなるのですが… USB 5 2022/06/24 17:21
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
ハンドルはポインタか
-
C言語の関数と配列に関する質問
-
自作strcat
-
LPSTR型の初期化について
-
init関数の意味
-
いまc言語を独学で勉強している...
-
PASCALとFARの意味
-
Vector定義の配列の共有メモリ化
-
ポインタ引数をさらにポインタ...
-
マイコンのプログラムについて
-
c言語のエラーについて
-
C言語のvoid型ポインタ変数につ...
-
関数へのポインタ渡し
-
アドレスとポインタがどうして...
-
ハンドル、アドレス、ポインタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
NULLとブランクの違い
-
エラーの意味
-
DLL<->VB間での受け渡し(文字...
-
ハンドル、アドレス、ポインタ...
-
【C言語】戻り値が構造体の関数
おすすめ情報