Согласно документации, можно загрузить sf::Texture
три разных способа: из файла, из потока, из памяти. Я думаю, что мне нужен последний, но я даже не уверен в этом. И если я это сделаю, я не могу понять, как его использовать.
У меня есть метод, который, с учетом URL-адреса для работы, должен вернуть sf::Sprite
. Я успешно загружаю двоичные данные и сохраняю их в строке (так как Http::Response::getBody()
возвращает это). Я знаю, что это правильные данные, потому что, если я пишу и сохраняю его в файле, я могу просмотреть изображение. Однако мне не нужен файл, мне просто нужно отобразить изображение.
Вот функция:
sf::Sprite Downloader::GetPicture(const std::string &url)
{
sf::Http http;
std::string host = url.substr(0, url.find("net/")+4 );
std::string uri = url.substr(url.find("net/")+4, url.size());
http.setHost(host);
request.setUri(uri);
response = http.sendRequest(request);
std::string data = response.getBody();
//THIS IS WRONG
sf::Texture texture;
texture.loadFromMemory((void*)data, sizeof(data));
return sf::Sprite(texture);
/* THIS WORKS, BUT I DON'T WANT TO SAVE, REOPEN, THEN DELETE AT THE END
std::ofstream fileout("test.jpg", std::ios::binary);
fileout << data;
fileout.close();
*/
}
Вот подпись loadFromMemory
для ленивых (void*
меня смущает, возможно, проблема).
Кроме того, это может быть совершенно неправильный способ сделать это; возможно, расширение sf::InputStream
и использование loadFromStream
?
Проблема в том, что sf::Sprite
имеет размер 0 × 0 и размер 0, так как я знаю, что это неправильно.
В вашем коде есть две ошибки. Один был замечен Кейси, то есть вы должны использовать texture.loadFromMemory(data.data(), data.length())
.
Проблема с texture.loadFromMemory((void*)data, sizeof(data));
что вы загрузите некоторый мусор, а не обязательно данные изображения; вы загрузите другие атрибуты строки (например, целое число для длины и, возможно, указатель на сами данные).
Другая связана с проблемой белого квадрата: вы возвращаете спрайт, но не текстуру. После возвращения функции текстура будет уничтожена, и вместо спрайта будет отображаться только белый прямоугольник.
Вы могли бы сделать что-то вроде:
sf::Texture dlpicture(std::string host, std::string uri)
{
sf::Http http(host);
sf::Http::Request request(uri);
auto response = http.sendRequest(request);
auto data = response.getBody();
sf::Texture text;
text.loadFromMemory(data.data(), data.length());
return text;
}
который вы можете попробовать с помощью sf::Texture texture = dlpicture("www.sfml-dev.org", "download/goodies/sfml-logo-small.png");
,
SFML действительно поддерживает формат jpg, но не все его варианты. Например, прогрессивный jpg не поддерживается. Вам придется использовать другой формат.
texture.loadFromMemory(data.data(), data.size());
Failed to load image from memory. Reason : JPEG format not supported (progressive)
...