Как создать байтовый массив в формате PNG из ID3D11Texture2D без сохранения / загрузки файла? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть ID3D11Texture2D.Конечная цель состоит в том, чтобы взять изображение и встроить его в html в виде строки в кодировке base64 (требования основаны на существующей функциональности, которой я не могу управлять).Я могу добиться этого, сохраняя текстуру в файл, используя DirectX::SaveWICTextureToFile, загружая текстуру в виде байтового массива, затем кодируя массив в base64, но я бы хотел сделать это без сохранения в файл, если это возможно.

В идеале должна быть какая-то функция SaveWICTextureToMemory, которая может принимать формат контейнера в качестве параметра, но до сих пор я не нашел ничего, что касалось формата.Я проверил CreateWICTextureFromMemory и другие функции в пакете WICTextureLoader, но я не нашел именно то, что я ищу (возможно, я пропустил это).Чтобы выяснить, SaveWICTextureToFile должен сгенерировать байтовый массив для записи в файл, я попытался распаковать эту функцию и убрать из нее элементы создания файла, но решил, что, вероятно, существует более простое решение, которое привело меня сюда.

У меня не так много кода, чтобы посмотреть, потому что я только заглушил многие ключевые функции, но это, как правило, то, что нужно для жизни:

HRESULT ExportImages::GetAngleEncodedString(std::string& encoded, const DirectX::XMMATRIX& projectionMatrix, float radians) const
{
   // Draws geometry to m_Texture2D
   DrawAngle(projectionMatrix, radians);

   unsigned const char* pngBytes = GetPNGBytes(m_Texture2D);

   try
   {
      encoded = Base64Encode(pngBytes);
   }
   catch (...)
   {
      // TODO don't catch all, add resolution
      return HRESULT(-1);
   }

   return S_OK;
}

unsigned const char* ExportImages::GetPNGBytes(ID3D11Texture2D* texture) const
{
   // ???
}
...