Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [1.6]Sprite blanc  (Lu 2551 fois)

0 Membres et 1 Invité sur ce sujet

DrakeRoxas

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
[1.6]Sprite blanc
« le: Octobre 25, 2012, 08:11:58 pm »
Bonjour

J'aimerais faire un logiciel de comparaison d'images (j'en ai fait un sur java mais il est lent et plante aux allentours de 4000 images (out of memory)) et j'ai décider de le faire en C++. donc j'ai choisi SFML parce que blablabla, et je me suis retrouver avec une jolie image de test. Toute blanche. Alors qu'elle est verte >>

Pour résumer un peu le code :
vector<sf::Sprite*> images; // Liste des images (pointeurs)

// Charger une image redimentionnée
sf::Sprite* loadScaledImg(string name)
{
    // Chargement de l'image
    sf::Image Image;
    if (!Image.LoadFromFile(name))
        return NULL;

    // Redimmentionnement
    float w = Image.GetWidth();
    float h = Image.GetHeight();
    float scale;
    if(w >= h)
        scale = SIZE_THUMBNAIL/w;
    else
        scale = SIZE_THUMBNAIL/h;

    // Création du sprite
    sf::Sprite *Sprite;
    Sprite = new sf::Sprite(Image);
    Sprite->Scale(scale, scale);

    cout << name << endl; // Test d'existance

    return Sprite;
}

int main()
{
    // Code pour récupérer les noms d'image dans la liste "files"

    // Chargement de la liste d'images redimentionnées
    int i;
    for(i = 0; i < files.size(); i++)
    {
        sf::Sprite* s = loadScaledImg(files[i]);
        if(s != NULL)
            images.push_back(s);
    }

     // Creation de la fenêtre
     sf::RenderWindow App(sf::VideoMode(800, 600), "SFML window");

     // Attente de fermeture
     while (App.IsOpened())
     {
         sf::Event Event;
         while (App.GetEvent(Event))
         {
             // Fermeture
             if (Event.Type == sf::Event::Closed)
                 App.Close();
         }
         // Clear
         App.Clear();

         // Dessiner le sprite
         App.Draw(*images[0]); // Testé avec 0 1 2 3 (j'ai 4 images)

         // Ecrire le texte (ça marche)
         App.Draw(Text);

         // Afficher
         App.Display();
     }
     return EXIT_SUCCESS;


Dans les 4 images, j'ai une image toute verte, et 3 autres avec une croix rouge (l'une plus grande que les  autres) et j'obtient juste un carré blanc sur le rendu final (redimensionné, mais blanc).
Une idée ?

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : [1.6]Sprite blanc
« Réponse #1 le: Octobre 25, 2012, 09:26:48 pm »
C'est parce que, dans la fonction loadScaledImg, tu crées un Sprite pointant sur une Image qui est supprimée à la fin de la fonction.

Petite remarque: pense à libérer la mémoire dynamique de tes Sprites à coup de delete.

DrakeRoxas

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : [1.6]Sprite blanc
« Réponse #2 le: Octobre 25, 2012, 09:44:39 pm »
ok, j'ai créer un vector<sf::Image*> pour tout stocker et ça marche.

Par contre je me demandais : Y a moyen d'enregistrer la version redimentionnée à la place de celle d'origine ? A la base je redimensionne pour gagner un peu de mémoire, mais si je doit garder l'image entière, je gagne plus grand chose :s

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : [1.6]Sprite blanc
« Réponse #3 le: Octobre 25, 2012, 09:51:24 pm »
La première solution que j'ai en tête est de dessiner l'image redimensionnée sur une RenderTexture ... sauf que RenderTexture est une nouveauté de SFML 2. Avec la version 1.6 je ne vois pas de solution évidente.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [1.6]Sprite blanc
« Réponse #4 le: Octobre 25, 2012, 09:59:08 pm »
SFML ne propose pas d'algorithmes de manipulation d'image. Si tu veux économiser de la mémoire en redimensionnant tes images, il va falloir utiliser autre chose (et SFML 2 aussi). Des bibliothèques qui font ça, il y en a à la pelle, tu ne devrais pas avoir de souci pour trouver ton bonheur ;)
Laurent Gomila - SFML developer