GImage::GImage(GRenderer * renderer, const char * filename) { //USES_CONVERSION; D3DXIMAGE_INFO info; D3DXGetImageInfoFromFileA(filename, &info); //이미지 정보를 저장 D3DXCreateTextureFromFileExA(renderer->getDevice(), filename, info.Width, info.Height, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, -1, -1, 0xffff00ff, &info, NULL, &texture); width = info.Width; height = info.Height; }
static void test_D3DXGetImageInfo(void) { HRESULT hr; D3DXIMAGE_INFO info; BOOL testdummy_ok, testbitmap_ok; hr = create_file("testdummy.bmp", noimage, sizeof(noimage)); /* invalid image */ testdummy_ok = SUCCEEDED(hr); hr = create_file("testbitmap.bmp", bmp01, sizeof(bmp01)); /* valid image */ testbitmap_ok = SUCCEEDED(hr); /* D3DXGetImageInfoFromFile */ if(testbitmap_ok) { todo_wine { hr = D3DXGetImageInfoFromFileA("testbitmap.bmp", &info); ok(hr == D3D_OK, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3D_OK); } hr = D3DXGetImageInfoFromFileA("testbitmap.bmp", NULL); /* valid image, second parameter is NULL */ ok(hr == D3D_OK, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3D_OK); } else skip("Couldn't create \"testbitmap.bmp\"\n");
//! creates a surface from the file Image* ImageLoaderX::LoadImageFromFile(FileReader* file) { IDirect3DSurface9* pSurf = NULL; D3DXIMAGE_INFO info; D3DXGetImageInfoFromFileA(file->GetFileName(), &info); m_pID3DDevice->CreateOffscreenPlainSurface(info.Width, info.Height, info.Format, D3DPOOL_SCRATCH, &pSurf, NULL); D3DXLoadSurfaceFromFileA(pSurf, NULL, NULL, file->GetFileName(), NULL, D3DX_FILTER_NONE, 0, &info); Image* image = 0; if (pSurf) { // create surface D3DLOCKED_RECT lockRect; D3DSURFACE_DESC desc; switch (info.Format) { case D3DFMT_A8R8G8B8: case D3DFMT_X8R8G8B8: pSurf->LockRect(&lockRect, NULL, D3DLOCK_READONLY); image = new Image(ECF_A8R8G8B8, dimension2d<s32>(info.Width, info.Height), lockRect.pBits, FALSE); break; case D3DFMT_R8G8B8: pSurf->LockRect(&lockRect, NULL, D3DLOCK_READONLY); pSurf->GetDesc(&desc); image = new Image(ECF_R8G8B8, dimension2d<s32>(info.Width, info.Height), lockRect.pBits, FALSE); break; case D3DFMT_A1R5G5B5: case D3DFMT_X1R5G5B5: pSurf->LockRect(&lockRect, NULL, D3DLOCK_READONLY); image = new Image(ECF_A1R5G5B5, dimension2d<s32>(info.Width, info.Height), lockRect.pBits, FALSE); break; case D3DFMT_R5G6B5: pSurf->LockRect(&lockRect, NULL, D3DLOCK_READONLY); image = new Image(ECF_R5G6B5, dimension2d<s32>(info.Width, info.Height), lockRect.pBits, FALSE); break; default: Printer::Log("No matched image format", ELL_ERROR); break; } } else { Printer::Log("D3DXLoadSuface failed", ELL_ERROR); return NULL; } pSurf->Release(); return image; }
void Image::ImageLoad() { //D3DXCreateTextureFromFileInMemoryEx( // g_d3dDev, // NULL, // 0, // 0, // 0, // 1, // 0, // D3DFMT_A8R8G8B8, // D3DPOOL_MANAGED, // D3DX_FILTER_POINT, // D3DX_FILTER_POINT, // D3DCOLOR_ARGB(0, 255, 255, 255), // NULL, // NULL, // (LPDIRECT3DTEXTURE9*)&this->tex); D3DXIMAGE_INFO info; D3DXGetImageInfoFromFileA( this->buf, &info); this->width = info.Width; this->height = info.Height; D3DXCreateTextureFromFileExA( g_d3dDev, this->buf, this->width, this->height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_POINT, D3DX_FILTER_POINT, D3DCOLOR_ARGB(0, 255, 255, 255), NULL, NULL, (LPDIRECT3DTEXTURE9*)&this->tex); }
void RoundProcess::loadImage(const char* pszName, IDirect3DDevice9* pDev) { return; D3DXIMAGE_INFO info; D3DXGetImageInfoFromFileA(pszName, &info); D3DXCreateTextureFromFileExA(pDev, pszName, info.Width, info.Height, info.MipLevels, D3DUSAGE_DYNAMIC, info.Format, D3DPOOL_DEFAULT, D3DX_FILTER_TRIANGLE, // D3DPOOL_DEFAULT²Å¿ÉÐС£¡£ D3DX_FILTER_TRIANGLE, D3DCOLOR_ARGB(255,255,255,255), NULL, NULL, &m_pTexture); pDev->CreateVertexBuffer(6*sizeof(VertexS), D3DUSAGE_WRITEONLY, VertexS::FVF, D3DPOOL_MANAGED, &m_pVb, 0); m_x = 0; m_y = 0; m_w = info.Width; m_h = info.Height; VertexS *pVec; m_pVb->Lock(0, sizeof(VertexS)*6, (void**)&pVec, 0); float fix = -0.5f; float z = 0.f; m_color = 0xffffffff; pVec[0] = VertexS(m_x + fix, m_y + fix, z, 1.0f, m_color, 0.0f, 0.0f); pVec[1] = VertexS(m_x + (float)info.Width + fix, m_y + fix, z, 1.0f, m_color, 1.0f, 0.0f); pVec[2] = VertexS(m_x + fix, m_y + (float)info.Height + fix, z, 1.0f, m_color, 0.0f, 1.0f); pVec[3] = VertexS(m_x + fix, m_y + (float)info.Height + fix, z, 1.0f, m_color, 0.0f, 1.0f); pVec[4] = VertexS(m_x + (float)info.Width + fix, m_y + fix, z, 1.0f, m_color, 1.0f, 0.0f); pVec[5] = VertexS(m_x + (float)info.Width + fix, m_y + (float)info.Height + fix, z, 1.0f, m_color, 1.0f, 1.0f); m_pVb->Unlock(); }
bool CMSprite::LoadAImage(const char* pszName, IDirect3DDevice9 *pDevice) { D3DXIMAGE_INFO info; D3DXGetImageInfoFromFileA(pszName, &info); D3DXCreateTextureFromFileExA(pDevice, pszName, info.Width, info.Height, info.MipLevels, D3DUSAGE_DYNAMIC, info.Format, D3DPOOL_DEFAULT, D3DX_FILTER_TRIANGLE, // D3DPOOL_DEFAULT才可行。。 D3DX_FILTER_TRIANGLE, D3DCOLOR_ARGB(255,255,255,255), NULL, NULL, &m_pTexture); pDevice->CreateVertexBuffer(3*sizeof(Vertex3D), 0/*D3DUSAGE_WRITEONLY*/, Vertex3D::FVF, D3DPOOL_DEFAULT/*D3DPOOL_MANAGED*/, &m_pVb, 0); m_x = -1.0f; m_y = 0.0f; m_w = 1.0f;info.Width; m_h = 1.0f;info.Height; m_iw = 1.0f; info.Width; m_ih = 1.0f; info.Height; m_reClip.left = 0.f; m_reClip.top = 0.f; m_reClip.right = 1.0f; m_reClip.bottom = 1.0f; m_StretchX = 1.0f; m_StretchY = 1.0f; Vertex3D *pVec = NULL; if( FAILED(m_pVb->Lock(0, sizeof(Vertex3D)*/*6*/3, (void**)&pVec, 0) ) ) { MessageBoxA(NULL, "f", "f", NULL); return false; } float fix = /*0.0f; */ -0.5f; m_z = 1.0f; m_color = 0xffaaffff; // 注意坐标 /* y ^ | | | ------> x */ pVec[0] = Vertex3D(m_x + fix, m_y + fix, m_z, 0xffff0000, 0.0f, 1.0f); // -1.0f, 0.0f pVec[1] = Vertex3D(m_x + fix, m_y + m_h+ fix, m_z, 0xff00ff00, 0.0f, 0.0f); // -1.0f, 1.0f pVec[2] = Vertex3D(m_x + m_w + fix, m_y + m_h + fix, m_z, 0xffffffff, 1.0f, 0.0f); // // float fixup = 1.0f; // pVec[0] = Vertex3D(-1.0f,-1.0f, fixup, 0xffff0000, 0.f, 0.f); // pVec[1] = Vertex3D(0.0f, 1.0f, fixup, 0xffffffff, 1.f, 1.f); // pVec[2] = Vertex3D(1.0f,-1.0f, fixup, 0xff0000ff, 0.f, 1.f); //pVec[3] = Vertex3D(m_x + m_w + fix, m_y + fix, m_z, m_color, 1.0f, 1.0f); m_pVb->Unlock(); m_pTest = m_pVb;//test m_bDirty = true; //标记为脏 return true; }
bool CAXModel::Load(const char* strFileName) { this->Unload(); m_strFile = strFileName; LPD3DXBUFFER pAdjacencyBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; if (FAILED(D3DXLoadMeshFromXA(m_strFile.c_str(), D3DXMESH_MANAGED, APROJECT_WINDOW->GetD3DDevice(), &pAdjacencyBuffer, &pMtrlBuffer, NULL, &m_dwNumMaterials, &m_pMeshObject))) return false; // Optimize the mesh for performance if (FAILED(m_pMeshObject->OptimizeInplace(D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE, (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL))) { SAFE_RELEASE(pAdjacencyBuffer); SAFE_RELEASE(pMtrlBuffer); return false; } D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); do { if (d3dxMtrls && m_dwNumMaterials > 0) { // Allocate memory for the materials and textures m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials]; if (m_pMaterials == NULL) break; m_pTextures = new LPDIRECT3DBASETEXTURE9[m_dwNumMaterials]; if (m_pTextures == NULL) break; m_strMaterials = new CHAR[m_dwNumMaterials][MAX_PATH]; if (m_strMaterials == NULL) break; // Copy each material and create its texture for (DWORD i = 0; i < m_dwNumMaterials; i++) { // Copy the material m_pMaterials[i] = d3dxMtrls[i].MatD3D; m_pTextures[i] = NULL; // Create a texture if (d3dxMtrls[i].pTextureFilename) { strcpy_s(m_strMaterials[i], MAX_PATH, d3dxMtrls[i].pTextureFilename); CHAR strTexture[MAX_PATH]; D3DXIMAGE_INFO ImgInfo; // First attempt to look for texture in the same folder as the input folder. int p = 0; strcpy_s(strTexture, MAX_PATH, m_strFile.c_str()); for (DWORD j = 0; j < strlen(strTexture); j++) { if (strTexture[j] == '/') p = j; } strTexture[p + 1] = 0; strcat_s(strTexture, MAX_PATH, d3dxMtrls[i].pTextureFilename); // Inspect the texture file to determine the texture type. if (FAILED(D3DXGetImageInfoFromFileA(strTexture, &ImgInfo))) continue; // Call the appropriate loader according to the texture type. switch (ImgInfo.ResourceType) { case D3DRTYPE_TEXTURE: { IDirect3DTexture9* pTex; if (SUCCEEDED(D3DXCreateTextureFromFileA(APROJECT_WINDOW->GetD3DDevice(), strTexture, &pTex))) { pTex->QueryInterface(IID_IDirect3DBaseTexture9, (LPVOID*)&m_pTextures[i]); pTex->Release(); } break; } case D3DRTYPE_CUBETEXTURE: { IDirect3DCubeTexture9* pTex; if (SUCCEEDED(D3DXCreateCubeTextureFromFileA(APROJECT_WINDOW->GetD3DDevice(), strTexture, &pTex))) { pTex->QueryInterface(IID_IDirect3DBaseTexture9, (LPVOID*)&m_pTextures[i]); pTex->Release(); } break; } case D3DRTYPE_VOLUMETEXTURE: { IDirect3DVolumeTexture9* pTex; if (SUCCEEDED(D3DXCreateVolumeTextureFromFileA(APROJECT_WINDOW->GetD3DDevice(), strTexture, &pTex))) { pTex->QueryInterface(IID_IDirect3DBaseTexture9, (LPVOID*)&m_pTextures[i]); pTex->Release(); } break; } } } } } } while (0); // Extract data from m_pMesh for easy access D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; m_dwNumVertices = m_pMeshObject->GetNumVertices(); m_dwNumFaces = m_pMeshObject->GetNumFaces(); m_dwBytesPerVertex = m_pMeshObject->GetNumBytesPerVertex(); m_pMeshObject->GetIndexBuffer(&m_pIB); m_pMeshObject->GetVertexBuffer(&m_pVB); m_pMeshObject->GetDeclaration(decl); APROJECT_WINDOW->GetD3DDevice()->CreateVertexDeclaration(decl, &m_pDecl); SAFE_RELEASE(pAdjacencyBuffer); SAFE_RELEASE(pMtrlBuffer); return true; }
static void test_D3DXGetImageInfo(void) { HRESULT hr; D3DXIMAGE_INFO info; BOOL testdummy_ok, testbitmap_ok; hr = create_file("testdummy.bmp", noimage, sizeof(noimage)); /* invalid image */ testdummy_ok = SUCCEEDED(hr); hr = create_file("testbitmap.bmp", bmp01, sizeof(bmp01)); /* valid image */ testbitmap_ok = SUCCEEDED(hr); /* D3DXGetImageInfoFromFile */ if(testbitmap_ok) { hr = D3DXGetImageInfoFromFileA("testbitmap.bmp", &info); ok(hr == D3D_OK, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromFileA("testbitmap.bmp", NULL); /* valid image, second parameter is NULL */ ok(hr == D3D_OK, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3D_OK); } else skip("Couldn't create \"testbitmap.bmp\"\n"); if(testdummy_ok) { hr = D3DXGetImageInfoFromFileA("testdummy.bmp", NULL); /* invalid image, second parameter is NULL */ ok(hr == D3D_OK, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromFileA("testdummy.bmp", &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); } else skip("Couldn't create \"testdummy.bmp\"\n"); hr = D3DXGetImageInfoFromFileA("filedoesnotexist.bmp", &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromFileA("filedoesnotexist.bmp", NULL); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromFileA("", &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromFileA(NULL, &info); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileA(NULL, NULL); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFile returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); /* D3DXGetImageInfoFromResource */ todo_wine { hr = D3DXGetImageInfoFromResourceA(NULL, MAKEINTRESOURCEA(IDB_BITMAP_1x1), &info); /* RT_BITMAP */ ok(hr == D3D_OK, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromResourceA(NULL, MAKEINTRESOURCEA(IDB_BITMAP_1x1), NULL); ok(hr == D3D_OK, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3D_OK); } hr = D3DXGetImageInfoFromResourceA(NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), &info); /* RT_RCDATA */ ok(hr == D3D_OK, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromResourceA(NULL, MAKEINTRESOURCEA(IDS_STRING), &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromResourceA(NULL, MAKEINTRESOURCEA(IDS_STRING), NULL); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromResourceA(NULL, "resourcedoesnotexist", &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromResourceA(NULL, "resourcedoesnotexist", NULL); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromResourceA(NULL, NULL, NULL); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); /* D3DXGetImageInfoFromFileInMemory */ hr = D3DXGetImageInfoFromFileInMemory(bmp01, sizeof(bmp01), &info); ok(hr == D3D_OK, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromFileInMemory(bmp01, sizeof(bmp01)+5, &info); /* too large size */ ok(hr == D3D_OK, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromFileInMemory(bmp01, sizeof(bmp01), NULL); ok(hr == D3D_OK, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromFileInMemory(noimage, sizeof(noimage), NULL); ok(hr == D3D_OK, "D3DXGetImageInfoFromResource returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXGetImageInfoFromFileInMemory(noimage, sizeof(noimage), &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); todo_wine { hr = D3DXGetImageInfoFromFileInMemory(bmp01, sizeof(bmp01)-1, &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); } hr = D3DXGetImageInfoFromFileInMemory(bmp01+1, sizeof(bmp01)-1, &info); ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromFileInMemory(bmp01, 0, &info); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(bmp01, 0, NULL); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(noimage, 0, &info); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(noimage, 0, NULL); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(NULL, 0, &info); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(NULL, 4, NULL); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(NULL, 4, &info); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXGetImageInfoFromFileInMemory(NULL, 0, NULL); ok(hr == D3DERR_INVALIDCALL, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); /* cleanup */ if(testdummy_ok) DeleteFileA("testdummy.bmp"); if(testbitmap_ok) DeleteFileA("testbitmap.bmp"); }
bool parseCodeImage(const char* pszPath) { D3DXIMAGE_INFO info; HRESULT re = D3DXGetImageInfoFromFileA(pszPath, &info); if(re != S_OK) return false; IDirect3DTexture9 *pText = NULL; //D3DXCreateTextureFromFileA(g_pDevice, pszPath, &pText); //用没有 EX 的函数, 创建的纹理长宽会变成 2的 n次方 re = D3DXCreateTextureFromFileExA(g_pDevice, pszPath, info.Width, info.Height, info.MipLevels, 0/*D3DUSAGE_RENDERTARGET*/, info.Format, D3DPOOL_SYSTEMMEM, D3DX_FILTER_TRIANGLE,D3DX_FILTER_TRIANGLE,D3DCOLOR_ARGB(255,0,0,0), NULL, NULL, &pText); FILE* pFile = fopen("D:/hehe.txt", "w"); D3DLOCKED_RECT rc; pText->LockRect(0, &rc, NULL, 0); BYTE bR = 0, bG = 0, bB = 0; DWORD* pSrc = (DWORD*)rc.pBits; for (int i = 0; i < info.Height ; i++) { for (int j = 0; j < info.Width; j++) { bR = (*pSrc) >> 16; bG = (*pSrc) << 16 >> 24; bB = (*pSrc) & 0x000000ff; if (bR >= 205 && bG >= 205 && bB >= 205) { fprintf(pFile, "1"); } else { fprintf(pFile, "8"); } BYTE t = max( max(bR, bG), bB); *pSrc = t | t << 8 | t << 16; ++pSrc; } fprintf(pFile, "\r\n"); } pText->UnlockRect(0); // 保存灰度图 re = D3DXSaveTextureToFileA("D:/hehe.jpg", D3DXIFF_BMP, pText, NULL); pText->Release(); fclose(pFile); }