2

現在、CreateWICTextureFromFile を使用してテクスチャをロードしていますが、それをもう少し制御したいと思います。また、画像をバイト形式でリソース ローダーに保存したいと考えています。以下は、2 つの別々の結果を返す 2 つのテスト コードのセットです。考えられる解決策についての洞察を探しています。

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

上記のコードは、画像形式が不明であることを返します。

私は明らかにここで何か間違ったことをしています。どんな助けも大歓迎です。スタックオーバーフローで似たようなものを見つけようとしましたが、グーグルは役に立ちませんでした。

4

1 に答える 1

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

それは確かにばかげたエラーでした。

于 2012-12-20T16:19:38.123 に答える