Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1338 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Ouvrir une image avec Wxwidget

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ouvrir une image avec Wxwidget

n°938120
freerider1
Posté le 05-01-2005 à 16:39:38  profilanswer
 

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.

mood
Publicité
Posté le 05-01-2005 à 16:39:38  profilanswer
 

n°938143
freerider1
Posté le 05-01-2005 à 16:45:10  profilanswer
 

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
n°938163
Lam's
Profil: bas.
Posté le 05-01-2005 à 16:57:15  profilanswer
 

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.  

n°938169
Lam's
Profil: bas.
Posté le 05-01-2005 à 17:01:04  profilanswer
 

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
n°938176
freerider1
Posté le 05-01-2005 à 17:05:39  profilanswer
 

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 ?
 
 
 

n°938196
freerider1
Posté le 05-01-2005 à 17:18:08  profilanswer
 

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
n°938198
Lam's
Profil: bas.
Posté le 05-01-2005 à 17:22:11  profilanswer
 

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);


n°938208
HelloWorld
Salut tout le monde!
Posté le 05-01-2005 à 17:34:16  profilanswer
 

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
n°938210
freerider1
Posté le 05-01-2005 à 17:36:20  profilanswer
 

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.

n°938334
HelloWorld
Salut tout le monde!
Posté le 05-01-2005 à 19:02:21  profilanswer
 

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
mood
Publicité
Posté le 05-01-2005 à 19:02:21  profilanswer
 

n°938899
freerider1
Posté le 06-01-2005 à 11:09:47  profilanswer
 

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.

n°938966
freerider1
Posté le 06-01-2005 à 12:01:41  profilanswer
 

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.

n°1066496
ffluSh
Linux c\\\'est bon, mangez-en !
Posté le 30-04-2005 à 03:23:46  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Ouvrir une image avec Wxwidget

 

Sujets relatifs
[Java] Mettre une image de fond dans un container [Resolu]Découper une image en java
image cliquable dans un mailProgramme Image--->Matrice
Problème Image + DateProblème insertion d'image en html
associer une image a l'adresse de son siteImage dans la barre d'adresse
ouvrir et modifier un fichier word en asp.netUne image dans une CChildFrame
Plus de sujets relatifs à : Ouvrir une image avec Wxwidget


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR