2012-12-19 52 views
2

我目前已经使用CreateWICTextureFromFile加载了纹理,但是我想稍微控制一下它,并且我想将图像以字节的形式存储在资源加载器中。以下是两组测试代码,它们返回两个单独的结果,我正在寻找可能的解决方案的任何见解。DirectX11 CreateWICTextureFromMemory使用PNG

ID3D11ShaderResourceView* srv; 

std::basic_ifstream<unsigned char> file("image.png", std::ios::binary); 

file.seekg(0,std::ios::end); 
int length = file.tellg(); 
file.seekg(0,std::ios::beg); 

unsigned char* buffer = new unsigned char[length]; 
file.read(&buffer[0],length); 

file.close(); 

HRESULT hr; 
hr = DirectX::CreateWICTextureFromMemory(_D3D->GetDevice(), _D3D->GetDeviceContext(), &buffer[0], sizeof(buffer), nullptr, &srv, NULL); 

作为上述代码的返回,我找不到组件。

std::ifstream file; 
ID3D11ShaderResourceView* srv; 

file.open("../Assets/Textures/osg.png", std::ios::binary); 

file.seekg(0,std::ios::end); 
int length = file.tellg(); 
file.seekg(0,std::ios::beg); 

std::vector<char> buffer(length); 
file.read(&buffer[0],length); 

file.close(); 

HRESULT hr; 
hr = DirectX::CreateWICTextureFromMemory(_D3D->GetDevice(), _D3D->GetDeviceContext(), (const uint8_t*)&buffer[0], sizeof(buffer), nullptr, &srv, NULL); 

上述代码返回图像格式未知。

我很清楚在这里做错了什么,任何帮助,非常感谢。试图找到任何甚至类似的在stackoverflow和谷歌无济于事。

+0

找不到哪个组件? – zdd

回答

3

希望有人试图做同样的事情会找到这个解决方案。

下面是我用来解决这个问题的代码。

std::basic_ifstream<unsigned char> file("image.png", std::ios::binary); 

if (file.is_open()) 
{ 
    file.seekg(0,std::ios::end); 
    int length = file.tellg(); 
    file.seekg(0,std::ios::beg); 

    unsigned char* buffer = new unsigned char[length]; 
    file.read(&buffer[0],length); 
    file.close(); 

    HRESULT hr; 
    hr = DirectX::CreateWICTextureFromMemory(_D3D->GetDevice(), _D3D->GetDeviceContext(), &buffer[0], (size_t)length, nullptr, &srv, NULL); 
} 

CreateWICTextureFromMemory

(size_t)length重要的变化这确实是一个愚蠢的错误。