DirectX11 CreateWICTextureFromMemory使用PNG

时间:2012-12-19 20:53:12

标签: directx png directx-11 wic

我目前使用CreateWICTextureFromFile加载纹理但是我想对它进行更多控制,并且我想在资源加载器中以字节形式存储图像。下面只是两组测试代码,它们返回两个不同的结果,我正在寻找对可能解决方案的任何见解。

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);

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

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上发现任何类似的东西,并且谷歌无济于事。

1 个答案:

答案 0 :(得分: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);
}

(size_t)length

中的重要变化为CreateWICTextureFromMemory

这确实是一个愚蠢的错误。