PDA

View Full Version : [C++] Progetto-Visualizzatore di Immagini


Mulder90
07-05-2010, 13:45
Ciao a tutti,per il corso di C++ il professore mi ha assegnato di fare un visualizzatore di immagini usando le wxWidgets :cry:
Le ho provate ma non mi picciono propio...molto meglio le QT.
L'unica problema è che un altro gruppo fa un visualizzatore di immagini...loro con le QT.
Se parlo con il professore sicuramente potrei cambiare e usare le QT ma volevo sapere se esisteva qualcosa di diverso oltre QT e wxWidgets.

tuccio`
07-05-2010, 13:53
gtk+?

Mulder90
07-05-2010, 13:59
gtk+?

vantaggi rispetto alle wxWidgets?Non sono solo per il C?

tuccio`
07-05-2010, 14:09
vantaggi rispetto alle wxWidgets?Non sono solo per il C?boh per me son più semplici le wxWidgets, comunque hanno un'interfaccia per vari linguaggi (tra cui C++) anche se son scritte in C

Mulder90
07-05-2010, 14:13
boh per me son più semplici le wxWidgets, comunque hanno un'interfaccia per vari linguaggi (tra cui C++) anche se son scritte in C

se le wxWidgets sono più semplici allora sono messo male :D


Conoscete qualche libreria adatta a fare un visualizzatore di immagini?

tomminno
07-05-2010, 15:31
Conoscete qualche libreria adatta a fare un visualizzatore di immagini?

OpenCV?
Ma se vai con le Qt è decisamente tutto più bello e più facile: usi un bel PictureFlow e fai un figurone. Magari ti diverti pure con l'AnimationFramework.

Io in questo periodo mi sto divertendo con QML (alias Qt Quick), semplicemente fantastico.

lock cmpxchg8b %ebx
07-05-2010, 15:39
wxWidgets e GTK+ (in questo caso meglio il binding C++ gtkmm) sono esclusivamente widget toolkit, mentre Qt è un framework vero e proprio.

PS: se sei sicuro di poter cambiare e usare le Qt... fallo, e anche di corsa.

Mulder90
07-05-2010, 18:12
PS: se sei sicuro di poter cambiare e usare le Qt... fallo, e anche di corsa.

Lo spero vivamente ;)

Mulder90
07-05-2010, 18:25
OpenCV?
mmm OpenCV mi sembra un pochino troppo.


Ma se vai con le Qt è decisamente tutto più bello e più facile: usi un bel PictureFlow e fai un figurone. Magari ti diverti pure con l'AnimationFramework.


Molto bello il PictureFlow :)
Grazie mille del consiglio.

Se dovessi essere obbligato a usare wxWidgets conosci qualcosa di simile per loro?

Mulder90
08-05-2010, 14:10
bene mi è arrivata la mail del professore e devo fare il progetto con le wxWidgets...
Conoscete qualche libreria per gestire le immagini in modo semplice?

Mulder90
12-07-2010, 18:17
ok ragazzi dopo aver fatto gli altri esami è venuto il momento di fare questo progetto.
Ho subito un pò di dubbi.
Se l'immagine è più grande rispetto alla dimensione dell'applicazione mi conviene ridimensionare l'immagine giusto?
Nel progetto devo utilizzare i pattern Observer-MVC.
Il problema è che non capisco dove utilizzarli. Mi spiego meglio:
Lo potrei utilizzare per tenere aggiornata la lista delle immagini presenti nella cartella giusto? Mi sembra l'unico utilizzo utilizzo sensato.
Il pattern MVC da quello che ho capito è molto legato al pattern Observer,qualcuno sa consigliarmi un sito dove trovafre della buona documentazione?
Voi come lo impostereste un progetto del genere?(non chiedo il codice ma solo un'idea sull'impostazione da seguire)

Mulder90
14-07-2010, 13:40
uuuuuuuuup :help:
Mi sono letto un po di roba sul pattern MVC.
Da quello che ho capito devo strutturare il progetto in 3 parti.
Model: dove deve essere implementato il "core" dell'applicazione.
View:dove implemento la GUI.
Controller:qui ho dei dubbi.Da quello che ho capito deve essere un "ponte" tra Model e View e quindi devo implementare la logica dei buttons ecc...(probabilmente ho detto un cavolata :D )

Il problema è che non capisco come faccia tutto ciò ad avere un livello di disaccoppiamento adeguato.
Se uso le wxWidgets per esempio i tre livelli non sono tutti e tre legati da questo framework?? :confused:

tuccio`
14-07-2010, 14:24
uuuuuuuuup :help:
Mi sono letto un po di roba sul pattern MVC.
Da quello che ho capito devo strutturare il progetto in 3 parti.
Model: dove deve essere implementato il "core" dell'applicazione.
View:dove implemento la GUI.
Controller:qui ho dei dubbi.Da quello che ho capito deve essere un "ponte" tra Model e View e quindi devo implementare la logica dei buttons ecc...(probabilmente ho detto un cavolata :D )

Il problema è che non capisco come faccia tutto ciò ad avere un livello di disaccoppiamento adeguato.
Se uso le wxWidgets per esempio i tre livelli non sono tutti e tre legati da questo framework?? :confused:l'unica cosa che ho letto a riguardo è "Progettazione del software e design pattern in Java" di Horstmann, in cui il pattern Observer viene descritto in maniera un po' diversa da quel che dici tu, diciamo che volendo schematizzare è Model che sta tra gli altri due, e non Controller come dici tu, ovvero:

Controller può dire a Model di "aggiornarsi", nel tuo caso ad esempio può dire che l'utente ha scelto un'altra immagine da visualizzare, quindi Model ricevendo l'ordine da Controller carica l'immagine e notifica a tutte le eventuali views (che quindi deve tenersi in qualche modo) di ridisegnarsi

Chiaramente, per scopi diversi, tutte le tue classi dovranno utilizzare wxwidgets, ma questo è ininfluente, il rapporto tra le tre classi deve essere quello del pattern MVC

tomminno
14-07-2010, 15:01
uuuuuuuuup :help:
Mi sono letto un po di roba sul pattern MVC.
Da quello che ho capito devo strutturare il progetto in 3 parti.
Model: dove deve essere implementato il "core" dell'applicazione.
View:dove implemento la GUI.
Controller:qui ho dei dubbi.Da quello che ho capito deve essere un "ponte" tra Model e View e quindi devo implementare la logica dei buttons ecc...(probabilmente ho detto un cavolata :D )

Il problema è che non capisco come faccia tutto ciò ad avere un livello di disaccoppiamento adeguato.
Se uso le wxWidgets per esempio i tre livelli non sono tutti e tre legati da questo framework?? :confused:

Con i framework grafici tradizionali (MFC, wx, qt, WinForms,...) View e Controller sono inglobati nei controlli, il Model ovviamente rimane fuori. Si parla di MVP (anche se Fowler ha stabilito che MVP non esiste più come pattern).
Secondo me cercare di infilare l'MVC in questi framework è controproducente, in generale hai un controller per ogni form, questo controller si trova a dover gestire ogni possibile evento scatenato da tutti i controlli grafici sotto il suo controllo, risultando una inutile duplicazione di quello che già viene fornito di default dai toolkit grafici tramite il Presenter.

Una sana strutturazione ad almeno 3 livelli (in cui i livelli business e data access costituiscono fondamentalmente il Model dell'MVC/P)dovrebbe essere la più indicata per questi framework.

tomminno
14-07-2010, 15:25
Chiaramente, per scopi diversi, tutte le tue classi dovranno utilizzare wxwidgets, ma questo è ininfluente, il rapporto tra le tre classi deve essere quello del pattern MVC

Se non fosse che wx è un framework MVP e non MVC, non hai modo di separare Controller e View per come sono definiti nel pattern MVC.

Mulder90
14-07-2010, 15:34
Secondo me cercare di infilare l'MVC in questi framework è controproducente, in generale hai un controller per ogni form, questo controller si trova a dover gestire ogni possibile evento scatenato da tutti i controlli grafici sotto il suo controllo, risultando una inutile duplicazione di quello che già viene fornito di default dai toolkit grafici tramite il Presenter.

Una sana strutturazione ad almeno 3 livelli (in cui i livelli business e data access costituiscono fondamentalmente il Model dell'MVC/P)dovrebbe essere la più indicata per questi framework.

Ecco il problema è che la mail del prof recita questo:
"Questi esempi richiedono di usare quantomeno il pattern Observer, e usando WxWidgets per l'interfaccia grafica anche l'MVC (http://it.wikipedia.org/wiki/Model-View-Controller). Ovviamente non importa raggiungere il livello di completezza, pulizia e design di un programma professionale, mi accontento di vedere l'impiego dei pattern e delle tecniche di progettazione e implementazione OO."

Ora la seconda parte forse riassume la tua idea sulla controproduttività poichè come dice devo solo impiegare questi pattern in modo da far vedere che ho capito più o meno di cosa stiamo parlando...:D
Però come posso affrontare la prima parte?Cioè come lo posso strutturare questo visualizzatore di immagini?

Mulder90
30-07-2010, 16:50
allora mi sono messo a scrivere qualcosa e non capisco perchè l'immagine viene visualizzata male.Così per esempio:
http://img834.imageshack.us/img834/8581/immaginezr.th.jpg (http://img834.imageshack.us/i/immaginezr.jpg/)

EDIT:mi sono reso conto che impostando il secondo valore di questa riga
Sizer->Add(Picture, 1, wxALL|wxEXPAND, 5 );

a 0 l'immagine viene visualizzata(sempre male :mad: ) però sulla parte sinistra..potrebbe essere un problema del Sizer?

MEtto quel poco che sono riuscito a scrivere sperando che qualcuno mi possa dare una mano :D

view.h
#include <wx/wx.h>
#include <wx/image.h>
#include <wx/filedlg.h>


class Frame : public wxFrame
{
public:

Frame(const wxString& title,const wxPoint& pos,const wxSize& size);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnOpen(wxCommandEvent& event);

DECLARE_EVENT_TABLE()
};

enum
{
ID_Open,
ID_Quit,
ID_About,
};



view.cpp
#include "view.h"


Frame::Frame(const wxString& title,const wxPoint& pos,const wxSize& size)
: wxFrame(NULL, -1,title,pos,size,wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );

wxMenu* menuFile = new wxMenu;
menuFile->Append(ID_Open,wxT("&Open"));
menuFile->Append(ID_Quit,wxT("&Exit"));


wxMenu* menuAbout= new wxMenu;
menuAbout->Append(ID_About,wxT("&About"));

wxMenuBar* menuBar = new wxMenuBar;
menuBar->Append(menuFile, wxT("&File"));
menuBar->Append(menuAbout, wxT("&About"));

SetMenuBar(menuBar);
}

void Frame::OnQuit(wxCommandEvent& event)
{
Close(true);
}

void Frame::OnOpen(wxCommandEvent& event)
{
wxString caption = wxT("Choose a file");
wxString wildcard =
wxT("All files (*.*)|*.*|BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif|JPEG files (*.jpg)|*.jpg");
wxString defaultDir = wxT("C:\\");
wxString defaultFilename = wxEmptyString;
wxFileDialog dialog(NULL, caption, defaultDir, defaultFilename,
wildcard, wxOPEN);
if (dialog.ShowModal() == wxID_OK)
{
wxString img = dialog.GetPath();
int filterIndex = dialog.GetFilterIndex();
if(img.empty()== false)
{
wxBoxSizer* Sizer = new wxBoxSizer(wxHORIZONTAL);
wxStaticBitmap* Picture = new wxStaticBitmap(this,wxID_ANY,wxBitmap(img,wxBITMAP_TYPE_ANY),wxDefaultPosition,wxDefaultSize,0);
Sizer->Add(Picture, 1, wxALL|wxEXPAND, 5 );

this->SetSizer( Sizer );
this->Layout();
}
img.Clear();
}
}

void Frame::OnAbout(wxCommandEvent& event)
{
wxMessageBox( wxT("Creato da Lorenzo Cinque!!!"),
wxT("About"),
wxOK | wxICON_INFORMATION, this );
}

BEGIN_EVENT_TABLE(Frame, wxFrame)
EVT_MENU(ID_Open,Frame::OnOpen)
EVT_MENU(ID_Quit, Frame::OnQuit)
EVT_MENU(ID_About, Frame::OnAbout)
END_EVENT_TABLE()


main.h
#include <wx/wx.h>

class MyApp : public wxApp
{
public:
virtual bool OnInit();
};


main.cpp

#include "main.h"
#include "view.h"

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
wxInitAllImageHandlers();
Frame* frame = new Frame(wxT("ImageViewer"), wxPoint(100,100),wxSize(800,600));
frame->Show(true);
SetTopWindow(frame);
return true;

}


Mi rendo conto che il codice è scritto maluccio ma è un inizio.
Qualcuno lo può provare e consigliarmi qualche strada?
Inoltre se apro un'altra immagine mi rendo conto che quella sotto rimane,come faccio a cancellarla e a liberare lo spazio nel momento in cui apro un'atra immagine?
Grazie a tutti quelli che avranno la volontà di aiutarmi :D
P.S: sono agli inizi quindi le critiche sono ben accette ;)

Vincenzo1968
31-07-2010, 13:15
OpenCV?
Ma se vai con le Qt è decisamente tutto più bello e più facile: usi un bel PictureFlow e fai un figurone. Magari ti diverti pure con l'AnimationFramework.

Io in questo periodo mi sto divertendo con QML (alias Qt Quick), semplicemente fantastico.

Andando a curiosare nel sito mi sono accorto che QML è implementato con QLALR, un generatore di parser per grammatiche di tipo LALR(1):

http://qt.nokia.com/developer/qtquarterly/qlalr-adventures/
http://labs.trolltech.com/blogs/category/labs/compilers/qlalr/
http://labs.trolltech.com/page/Projects/Compilers/QLALR

QLALR è compreso fra i tool che QT mette a disposizione!

:yeah: :winner: :yeah:

Mulder90
31-07-2010, 15:00
sono riuscito a far visualizzare l'immagine per bene dentro un pannell!!!

Però ora ho una domandina semplice semplice :sofico: ...è possibile inserire un Sizer dentro un pannello e poi inserirci l'immgine???
Così riuscirei a visualizzare l'immagine sempre al centro anche se allargo/rimpiccolisco l'applicazione...
Per ora è l'unica idea che mi è venuta in mente per fare ciò:D

Mulder90
15-09-2010, 10:00
Allora dopo parecchi problemi sono riuscito a fare qualcosa di funzionanete e ieri sono andato a farglielo vedere al professore ma non è stato apprezzato come desideravo >:(
In effetti dopo averci parlato un po mi ha fatto capire che il pattern va utilizzato per risolvere un problema ricorrente concreto e non, come ho fatto io, solo per superare l'esame.
In pratica ce lo avevo infilato a forza e il risultato è che era praticamente inutile... (rotfl)
Il professore mi ha fatto uno schema su come reimpostare il programma e su questo però mi sono venuti dei dubbi.

eccolo:http://img203.imageshack.us/img203/396/schemaobserver.th.png (http://img203.imageshack.us/i/schemaobserver.png/)

Da quello che ho capito il subject rappresenta i dati e quindi nel mio progetto dovrebbe essere la lista di immagini giusto?
L'observer rappresenta ciò che osserva il subject. L'observer è in attesa di cambiamenti da parte del subject e quando questi avvengono attraverso una funzione notify il subject avverte tutti gli observer i quali si aggiornano tramite la funzione Update.
Nel mio caso quindi gli observer dovrebbero essere List Viewer e quindi un lista visiva di immagini e l'immagine visualizzata nel panello(???).
Quindi tramite l'update dovrei aggiornare:
- le dimensioni dell'immagine e ridimensionarla in base al panello
- la lista accanto al panello dove ci sono le immagini.

I miei dubbi riguardano l'observer Image Viewer dello schema del professore.
Non capisco quale deve essere l'observe concreto.
Mi spiego meglio:
L'immagine visualizzata cambia ogni volta che scorro oppure quando apro nuove immagini....insomma non è un oggetto fisso.
L'unica cosa che è sempre fissa è il panello e quindi qualcosa mi dice che l'observer deve essere lui ma la cosa che mi frena è che poi è l'immagine a dover essere ridimensionata e quindi il metodo update deve essere chiamato sull'immagine.
Qualcuno a qualche consiglio su come strutturare il programma(classi)???
Mi potete dire se il mio ragionamento è sbagliato??
Insomma cerco lumi.

P.S: il codice non lo posto (per ora) tantoprima devo risolvere i problemi logici e non di codice che non funiona ecc..(anche perchè il programma funziona e svolge discretamente il suo lavoro)