ページ 11

D3DXCreateTextureFromFileInMemoryEx関数について

Posted: 2013年5月06日(月) 04:27
by bonbo
早速ですが質問させていただきます。
D3DXCreateTextureFromFileInMemoryEx関数の第三引数である

コード:

UINT SrcDataSize
にファイルのサイズを入れたいと思い、以下のようなコードを書いたのですがうまくいきません。(FALSEが返ってくる)
どのようにすればよいのでしょうか。

コード:

// test0.pngを開きたい
LPCSTR File_Name="test0.png";// 画像ファイル
	FILE *fp = fopen(File_Name,"rb");// ファイルをオープン
	//ファイルの大きさを取得したい
	UINT size = ftell(fp);// サイズを格納
	fclose(fp);// ファイルを閉じる
	hr = D3DXCreateTextureFromFileInMemoryEx(// 第三引数以外は間違いはないと思います
                                     gl_lpD3ddev,
                                     File_Name,
				                 size,                              //ここに関してです
                                     D3DX_DEFAULT,
                                     D3DX_DEFAULT,
                                     D3DX_DEFAULT,
                                     0,
                                     D3DFMT_A1R5G5B5,
                                     D3DPOOL_MANAGED,
                                     D3DX_FILTER_NONE,
                                     D3DX_FILTER_NONE,
                                     D3DCOLOR_ARGB( 255, 0, 0, 0),
                                     NULL,
                                     NULL,
                                     &gl_Texture[g_TextureMax]);
蛇足かもしれませんがD3DXCreateTextureFromFileEx関数では成功しています。

環境はwindows7(64bit)
VS2010
です。

よろしくお願いします。

Re: D3DXCreateTextureFromFileInMemoryEx関数について

Posted: 2013年5月06日(月) 04:50
by bonbo
一応下位互換のD3DXCreateTextureFromFileInMemoryでもやってみたのですがだめでした。
(http://www.c3.club.kyutech.ac.jp/gamewi ... 5%C1%A5%E3)から
丸々コピーしてきたものですが。

コード:

//=========================================
//
//ここで解読
//
//=========================================
void DeEncry(char *pcIn,char *pcOut,int iSize)
{
   for(int i = 0; i < iSize; i++)
   {
       pcOut[i] = pcIn[i] - 100;
   }
}

//===================================
//
//ここで画像の読み込み
//
//===================================
void Init()
{
   char *pBuffer;
   FILE *fp = fopen(g_pszFileName,"rb");

   //=========================
   //ファイルの大きさを取得
   //=========================
   fseek(fp,0,SEEK_END);
   int size = ftell(fp);
   pBuffer = new char[size];

   //===========================
   //ファイルのデータをバッファに確保
   //===========================
   fseek(fp,0,SEEK_SET);
   fread((void *)pBuffer,sizeof(char),size,fp);
   fclose(fp);
   DeEncry(pBuffer,pBuffer,size); 

   //====================================
   //バッファからテクスチャを作成
   //====================================
   g_pd3dTexture = D3DXCreateTextureFromFileInMemory(gl_lpD3ddev,pBuffer,size,&gl_Texture[g_TextureMax]);
   delete []pBuffer;  //解放も忘れずにね。
}

Re: D3DXCreateTextureFromFileInMemoryEx関数について

Posted: 2013年5月06日(月) 07:41
by h2so5
1. 何のためにD3DXCreateTextureFromFileInMemoryExを使っているのか理解できません。
File_Nameから読み込みたいのであればD3DXCreateTextureFromFileExを使えばいいのではないでしょうか。
第二引数に画像データではなくFile_Nameを渡している時点でおかしいです。
あとsizeに何が入っているかデバッガで確認してみてください。

2. 下のコード(D3DXCreateTextureFromFileInMemory)は丸々コピーしてきたと書いてありますが、
暗号化されている読み込む画像ファイルを読み込むコードだということを理解していますか?
上のコードと整合性が取れていないように見えますが。

Re: D3DXCreateTextureFromFileInMemoryEx関数について

Posted: 2013年5月06日(月) 23:30
by bonbo
返信がおくれてしまい、本当にもうしわけありませんでした。
>h2so5さん
ありがとうございます。

>1.何のためにD3DXCreateTextureFromFileInMemoryExを使っているのか理解できません。
File_Nameから読み込みたいのであればD3DXCreateTextureFromFileExを使えばいいのではないでしょうか。
第二引数に画像データではなくFile_Nameを渡している時点でおかしいです。

申し訳ありません。画像ファイルを外付けにしたくなかったのです。

画像データを渡すというのは、こういうことでしょうか

コード:

//
// resource.h
//
#define IDB_PNG1                        101

コード:

//
// resource.rc
//
IDB_PNG1                PNG                     "test0.png"     // リソースに画像ファイルを登録する
のようにリソースをメモリー内に作成
その後
fopen(?)し、画像を読み込む

コード:

    FILE *fp = fopen("test0.png","rb");// ファイルをオープン
    //ファイルの大きさを取得したい
    UINT size = ftell(fp);// サイズを格納
    fclose(fp);// ファイルを閉じる
    hr = D3DXCreateTextureFromFileInMemoryEx(// 第三引数以外は間違いはないと思います
                                     gl_lpD3ddev,
                                     "test0.png",
                                 size,                              //ここに関してです
                                     D3DX_DEFAULT,
                                     D3DX_DEFAULT,
                                     D3DX_DEFAULT,
                                     0,
                                     D3DFMT_A1R5G5B5,
                                     D3DPOOL_MANAGED,
                                     D3DX_FILTER_NONE,
                                     D3DX_FILTER_NONE,
                                     D3DCOLOR_ARGB( 255, 0, 0, 0),
                                     NULL,
                                     NULL,
                                     &gl_Texture[g_TextureMax]);
たぶんめちゃくちゃだと思いますが…

>あとsizeに何が入っているかデバッガで確認してみてください。
0でしたfopenはできているのですが(正の値が返ってくる)。
どこかおかしいみたいです。

分かりにくいのでソースコードをアップロードしておきます。
http://www1.axfc.net/uploader/so/2893549
該当箇所は
DRAW_GRAPHIC.hの17行目からです。分かりにくかったらすみません。

Re: D3DXCreateTextureFromFileInMemoryEx関数について

Posted: 2013年5月08日(水) 11:48
by bonbo
できました。

INMEMORYEX関数ではないですが、
D3DXCreateTextureFromResourceExで目的の結果を実現することができました。
MAKEINTRESOURCE(ID)関数を使っていなかったのが原因でした。

ありがとうございました。