Загрузка изображения из памяти

0

Согласно документации, можно загрузить 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, так как я знаю, что это неправильно.

  • 2
    Попробуйте texture.loadFromMemory(data.data(), data.size());
  • 0
    @Casey Я думаю, что это решение, потому что он говорит Failed to load image from memory. Reason : JPEG format not supported (progressive) ...
Показать ещё 3 комментария
Теги:
sfml

1 ответ

2
Лучший ответ

В вашем коде есть две ошибки. Один был замечен Кейси, то есть вы должны использовать 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 не поддерживается. Вам придется использовать другой формат.

  • 0
    Спасибо, я применил исправление Кейси, и все заработало, но белые квадраты действительно присутствовали. Я кратко подумал, что это может быть потому, что локальная текстура разрушается. С тех пор я рефакторинг программы, потому что я нашел ненужный код в другом месте, и теперь он работает ... Тем не менее, загрузка не достаточно быстрая, я думаю, мой следующий вопрос будет о распределении этой текстуры по потокам ...: D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню