IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API graphiques Discussion :

[Freeimage] Recupérer le pointeur de données


Sujet :

API graphiques

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut [Freeimage] Recupérer le pointeur de données
    Bonsoir
    Je m'arrache les cheveux depuis un bon moment sur un chargeur d'images tiré d'un tuto et que j'ai modifié pour utiliser Freeimage. Je charge une image grâce à Freeimage puis je veux construire un objet CImage dont le constructeur prend en argument le tableau de pixels mais rien à faire, chaque fois ça termine en SIGSEGV -_-

    Le programme crashe au moment où l'objet Image de type CImage est créé, j'imagine qu'il n'apprécie pas le tableau que je lui fournis :/

    Voici le code simplifié au maximum :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <iostream>
    #include <FreeImagePlus.h>
    #include <SFML/Graphics.hpp>
    #include "Image.hpp"
     
     
    int main()
    {
    	fipImage Data;
    	Data.load("/home/antoine/Images/Mark.png", 0);
     
    	const unsigned char* Pixels = reinterpret_cast<const unsigned char*>(Data.accessPixels());
     
        CImage* Image = new CImage (Pixels, Data.getWidth(), Data.getHeight(), Data.getBitsPerPixel());
     
    	sf::RenderWindow App(sf::VideoMode(640, 480, 32), "Window");
    	App.SetFramerateLimit(60);
     
    	sf::Image Texture;
    	Texture.LoadFromPixels(Image->getWidth(), Image->getHeight(), Image->getPixels());
    	sf::Sprite Sprite(Texture);
     
        while (App.IsOpened())
        {
            // Process events
            sf::Event Event;
            while (App.GetEvent(Event))
            {
                // Close window : exit
                if (Event.Type == sf::Event::Closed)
                    App.Close();
     
                // Escape key : exit
                if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                    App.Close();
     
            }
     
     
    		App.Draw(Sprite);
            // Display window on screen
            App.Display();
        }
    	delete Image;
    }
    Image.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #ifndef IMAGE_HPP_INCLUDED
    #define IMAGE_HPP_INCLUDED
     
    #include <vector>
    #include <string>
     
     
        class CImage
        {
            public:
            CImage(const unsigned char* Pixels, int Width, int Height, int BitsPerPixel);
            ~CImage();
     
    		int getHeight ();
    		int getWidth ();
            const unsigned char* getPixels () const;
     
            private:
            std::vector<unsigned char> m_Pixels;
            int m_Height;
            int m_Width;
            int m_BitsPerPixel;
        };
     
     
    #endif // IMAGE_HPP_INCLUDED
    Image.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include "Image.hpp"
     
     
     
        CImage::CImage(const unsigned char* Pixels, int Width, int Height, int BitsPerPixel) :
            m_Pixels(Pixels, Pixels + BitsPerPixel*Width*Height),
    		m_Width(Width),
    		m_Height(Height),
    		m_BitsPerPixel(BitsPerPixel)
        {
     
        }
     
        CImage::~CImage()
        {
     
        }
     
     
        int CImage::getHeight ()
    	{
            return m_Height;
    	}
     
     
        int CImage::getWidth ()
    	{
            return m_Width;
    	}
     
    	const unsigned char* CImage::getPixels () const
    	{
    		return &m_Pixels[0];
    	}
    Auriez-vous une idée du problème ?

    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    C'est bon, problème résolu, dans la liste d'initialisation du constructeur de CImage il fallait diviser par 8 le nombre de bits pour avoir le nombre d'octets (et donc de char) :
    m_Pixels(Pixels, Pixels + BitsPerPixel*Width*Height/8)

Discussions similaires

  1. recupérer table base de données
    Par lao.patrick dans le forum C#
    Réponses: 4
    Dernier message: 30/04/2010, 14h10
  2. pointeur sur donnée membre
    Par jfouche dans le forum Langage
    Réponses: 10
    Dernier message: 03/01/2010, 09h57
  3. conversion d'un pointeur de données vers un STL vector
    Par velkouby dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/01/2008, 16h22
  4. Réponses: 5
    Dernier message: 12/06/2006, 14h56
  5. [MFC] Accès pointeur qui donne rien :s
    Par EagleEye dans le forum MFC
    Réponses: 3
    Dernier message: 02/03/2006, 18h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo