Ouvrir une image avec Wxwidget

Ouvrir une image avec Wxwidget - C++ - Programmation

Marsh Posté le 05-01-2005 à 16:39:38    

Salut à tous,
j'essaye d'ouvrir une image avec Wxwidget.
Voilà comment ça se présente globalement:
 
Tout d'abord j'initilaise un JPEG handler dans l'init de mon appli (...OnInit()):

Code :
  1. wxImage::AddHandler( new wxJPEGHandler );


Je déclare dans la déclaration de ma frame un pointer sur un objet de classe wxImage:

Code :
  1. wxImage *m_pImage;


Finalement, dans la fonction qui ouvre l'image, j'appelle la fonction LoadFile:

Code :
  1. m_pImage->LoadFile(dlg->GetPath(),wxBITMAP_TYPE_JPEG);


 
 
J'ai toute une série d'erreur du type:
 
[linker error] Undefined reference to 'jpeg_...'
 
Je me suis demandé si il ne fallait pas que j'installe une librairie graphique, donc j'ai installer GD et j'ai fait une include de gd.h mais ça n'a pas solutionner le problème.
 
Quelqu'un à une idée.
Merci.

Reply

Marsh Posté le 05-01-2005 à 16:39:38   

Reply

Marsh Posté le 05-01-2005 à 16:45:10    

Maintenant j'ai plus d'erreur, car j'ai fait une référence au fichier libjpeg.a dans l'editeur de liens, mais ma fonction d'ouverture d'image ne fonctionne pas. J'ai bien la boite de dialoque mais quand je séléctionne un jpg et que je clique sur OK, l'image n'apparait pas.Quelqu'un a une idée de la raison pour laquelle ça ne fonctionne pas. Y a t'il d'autre choses à faire pour pouvoir ouvrir une image ?


Message édité par freerider1 le 05-01-2005 à 16:54:54
Reply

Marsh Posté le 05-01-2005 à 16:57:15    

T'as fais une alloc ? :)
wxImage *m_pImage = new wxImage;
 
Et sinon, le deuxième paramètre de LoadFile est optionnel. Essaie sans. Et vérifie que le chemin que tu passes est correct.  

Reply

Marsh Posté le 05-01-2005 à 17:01:04    

Ah, pour afficher, il faut faire un brave dc.DrawBitmap (en créant un Bitmap depuis l'image):
 

Code :
  1. //ImageCanvas a un membre:
  2. //wxBitmap * m_bmp;
  3. ImageCanvas::ImageCanvas( wxWindow *parent, wxWindowID id,
  4.                     const wxPoint &pos, const wxSize &size )
  5.         : wxScrolledWindow( parent, id, pos, size, wxCLIP_CHILDREN | wxNO_FULL_REPAINT_ON_RESIZE )
  6. {
  7.     wxImage image;
  8.     image.LoadFile(dlg->GetPath());
  9.     m_bm = new wxBitmap (image);
  10. }
  11. void ImageCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
  12. {
  13.     wxPaintDC dc( this );
  14.     PrepareDC( dc );
  15.     dc.DrawBitmap( *m_bm, 1, 1 , TRUE);
  16. }


Message édité par Lam's le 05-01-2005 à 17:04:34
Reply

Marsh Posté le 05-01-2005 à 17:05:39    

Oui,
m_pImage = new wxImage ();
sinon je pense que ca compilerait pas.
 
J'ai essayer sans le deuxième paramètre, ca ne change rien.
 
J'ai imprimé mon path dans la status bar et il est correct.
 
Sinon si quelqu'un à un programme qui fonctionne il pourrait me l'envoyer. Ou si vous connaissez un bon tutorial pour ouvrir une image avec Wxwidget ?
 
 
 

Reply

Marsh Posté le 05-01-2005 à 17:18:08    

Lam's, j'ai essayer ta solution, mais ça ne fonctionne pas non plus. C'est peut être parceque j'utilise pas une wxScrolledWindow. Moi j'utilise une WxFrame:

Code :
  1. TextFrame::TextFrame(const wxChar *title, int xpos, int ypos, int width, int height)
  2. : wxFrame((wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height)) {...}


 
Qu'est ce t'en pense ?


Message édité par freerider1 le 05-01-2005 à 17:19:08
Reply

Marsh Posté le 05-01-2005 à 17:22:11    

freerider1 a écrit :

Lam's, j'ai essayer ta solution, mais ça ne fonctionne pas non plus. C'est peut être parceque j'utilise pas une wxScrolledWindow. Moi j'utilise une WxFrame


 
Bon, il va te falloir t'investir un peu dans la doc, et voir comment fonctionne l'affichage, et les DCs.
 
En attendant, essaye ça dans ton code:

Code :
  1. wxImage image;
  2. image.LoadFile(dlg->GetPath());
  3. wxBitmap bm (image);
  4. wxClientDC dc(this);
  5. dc.DrawBitmap(bm, 10,10, TRUE);


Reply

Marsh Posté le 05-01-2005 à 17:34:16    

Faut déjà savoir si c'est l'image qui n'est pas chargée ou si elle est pas affichée. Essaye de créer un bitmap en mémoire et de le dessiner, et essaye de refiler ton jpeg lu à un wxStaticBitmap par exemple.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-01-2005 à 17:36:20    

Ca marche pas, mais comme tu dis, j'ai sans doute interêt à regarder l'affichage et les DCs dans la doc.
 
Quelqu'un connait un bon tutorial sur Wxwidget?
Moi j'ai déjà celui de Franky Braem (wxWindows 2 Programming cross-platform GUI applications in C++), mais j'en ai pas trouvé d'autre qui était bien fait.
Sinon il y a la doc officielle, mais j'ai pas encore assez d'expérience pour bien m'y retrouver.
 
En tout cas, merci à toi Lam's. Je reviendrais quand j'aurais potasser un peu le sujet.

Reply

Marsh Posté le 05-01-2005 à 19:02:21    

Oui, un de mes reproches à ce tk : le manque de doc. Y'a ça en français : http://chgi.developpez.com/wxwidgets/
Mais vu que c'est pas mal inspiré des MFC, un tutoriel sur les DC sous Windows devrait faire l'affaire.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-01-2005 à 19:02:21   

Reply

Marsh Posté le 06-01-2005 à 11:09:47    

Si vous télécharger les sources de Wxwidget (moi j'avais télécharger que devpack pour devcpp), il y a un répertoire sample dans lequel il y a pas mal d'exemple, dont celui d'une appli qui permet d'ouvrir une image. Faut que je regarde comment ça marche.

Reply

Marsh Posté le 06-01-2005 à 12:01:41    

Voilà un exemple qui fonctionne. Il faut donc bien redessiner un bitmap à partir de l'image que l'on veut ouvrir. Il s'agit d'une exemple fournit avec Wxwidget que j'ai simplifié car l'exemple original à bcp de fonctionnalités.
 
On a une frame principale pour l'appli (MyFrame) et une frame dans laquelle on ouvre l'image (MyImageFrame). Quand on clique sur show image dans le menu, on créer une objet de classe MyImageFrame auqel on passe l'image préalablement convertie en bitmap (wxBitmap(image)). Ce bitmap est redessiné via la fonction OnPaint de la classe MyImageFrame.
 
Attention de ne pas oublier d'ajouter les librairie suivantes dans l'editeur de liens:
 
libpng.a
libjpeg.a
libtiff.a
libzlib.a
 

Code :
  1. #include "wx/wxprec.h"
  2. #ifdef __BORLANDC__
  3. #pragma hdrstop
  4. #endif
  5. #ifndef WX_PRECOMP
  6. #include "wx/wx.h"
  7. #endif
  8. #include "wx/image.h"
  9. #include "wx/file.h"
  10. #include "wx/mstream.h"
  11. #include "wx/wfstream.h"
  12. #include "wx/quantize.h"
  13. // derived classes
  14. class MyFrame;
  15. class MyApp;
  16. class MyFrame: public wxFrame
  17. {
  18. public:
  19.     MyFrame();
  20.     void OnNewFrame( wxCommandEvent &event );
  21.     void OnQuit( wxCommandEvent &event );
  22. private:
  23.     DECLARE_DYNAMIC_CLASS(MyFrame)
  24.     DECLARE_EVENT_TABLE()
  25. };
  26. class MyImageFrame : public wxFrame
  27. {
  28. public:
  29.     MyImageFrame(wxFrame *parent, const wxBitmap& bitmap)
  30.         : wxFrame(parent, -1, _T("Double click to save" ),
  31.                   wxDefaultPosition, wxDefaultSize,
  32.                   wxCAPTION | wxSYSTEM_MENU),
  33.                   m_bitmap(bitmap)
  34.     {
  35.         SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
  36.     }
  37.     void OnPaint(wxPaintEvent& WXUNUSED(event))
  38.     {
  39.         wxPaintDC dc( this );
  40.         //TRUE for masked images
  41.         dc.DrawBitmap( m_bitmap, 0, 0, TRUE );
  42.     }
  43. private:
  44.     wxBitmap m_bitmap;
  45.     DECLARE_EVENT_TABLE()
  46. };
  47. // MyApp
  48. class MyApp: public wxApp
  49. {
  50. public:
  51.     virtual bool OnInit();
  52. };
  53. // main program
  54. IMPLEMENT_APP(MyApp)
  55. BEGIN_EVENT_TABLE(MyImageFrame, wxFrame)
  56.   EVT_PAINT(MyImageFrame::OnPaint)
  57. END_EVENT_TABLE()
  58. const int ID_QUIT  = 108;
  59. const int ID_NEW = 110;
  60. IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
  61. BEGIN_EVENT_TABLE(MyFrame,wxFrame)
  62.   EVT_MENU    (ID_QUIT,  MyFrame::OnQuit)
  63.   EVT_MENU    (ID_NEW,  MyFrame::OnNewFrame)
  64. END_EVENT_TABLE()
  65. MyFrame::MyFrame()
  66.        : wxFrame( (wxFrame *)NULL, -1, _T("wxImage sample" ),
  67.                   wxPoint(20,20), wxSize(470,360) )
  68. {
  69.   wxMenu *file_menu = new wxMenu();
  70.   file_menu->Append( ID_NEW, _T("&Show image..." ));
  71.   file_menu->AppendSeparator();
  72.   file_menu->Append( ID_QUIT, _T("E&xit" ));
  73.   wxMenuBar *menu_bar = new wxMenuBar();
  74.   menu_bar->Append(file_menu, _T("&File" ));
  75.   SetMenuBar( menu_bar );
  76.   CreateStatusBar(2);
  77.   int widths[] = { -1, 100 };
  78.   SetStatusWidths( 2, widths );
  79. }
  80. void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
  81. {
  82.   Close( TRUE );
  83. }
  84. void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) )
  85. {
  86.     wxString filename = wxFileSelector(_T("Select image file" ));
  87.     if ( !filename )
  88.         return;
  89.     wxImage image;
  90.     if ( !image.LoadFile(filename) )
  91.     {
  92.         wxLogError(_T("Couldn't load image from '%s'." ), filename.c_str());
  93.         return;
  94.     }
  95.     (new MyImageFrame(this, wxBitmap(image)))->Show();
  96. }
  97. //-----------------------------------------------------------------------------
  98. // MyApp
  99. //-----------------------------------------------------------------------------
  100. bool MyApp::OnInit()
  101. {
  102. #if wxUSE_LIBPNG
  103.   wxImage::AddHandler( new wxPNGHandler );
  104. #endif
  105. #if wxUSE_LIBJPEG
  106.   wxImage::AddHandler( new wxJPEGHandler );
  107. #endif
  108. #if wxUSE_LIBTIFF
  109.   wxImage::AddHandler( new wxTIFFHandler );
  110. #endif
  111. #if wxUSE_GIF
  112.   wxImage::AddHandler( new wxGIFHandler );
  113. #endif
  114. #if wxUSE_PCX
  115.   wxImage::AddHandler( new wxPCXHandler );
  116. #endif
  117. #if wxUSE_PNM
  118.   wxImage::AddHandler( new wxPNMHandler );
  119. #endif
  120. #if wxUSE_XPM
  121.   wxImage::AddHandler( new wxXPMHandler );
  122. #endif
  123.   wxFrame *frame = new MyFrame();
  124.   frame->Show( TRUE );
  125.   return TRUE;
  126. }


 
Encore merci pour votre aide.

Reply

Marsh Posté le 30-04-2005 à 03:23:46    

Bonsoir, moi j'aimerai trouver de la bonne doc FR sur wxWidget, car je trouve ca vraiment tres tres interessant !
 
j'ai déja celel de developpez, mais si quelqu'un connaitrait de meilleurs informations ,j'en serait fort content !  :love:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed