Προς το περιεχόμενο

παρουσίαση εικόνων σε C++


chrislem

Προτεινόμενες αναρτήσεις

Δημοσ.

Κατ΄αρχήν καλησπέρα σας,

 

Μου έχει ανατεθεί μία εργασία να κατασκευάσω ένα πρόγραμμα παρουσίασης εικόνων σε C++. Συγκεκριμένα το θέμα είναι αυτό. "Κατασκευή ενός προγράμματος για παρουσίαση εικόνων. Το πρόγραμμα θα μπορεί να φορτώνει τις εικόνες που θα φαίνονται αρχικά με το όνομα αρχείου σε μορφή λίστας με τη σειρά που φορτώνονται. Ο χρήστης θα μπορεί να εμφανίζει ένα preview ή ένα thumbnail για κάθε εικόνα. Ο χρήστης θα μπορεί επίσης να μπορεί να μεταβάλλει την σειρά των εικόνων και να διαγράφει/παρεμβάλλει εικόνες στην λίστα. Τέλος το πρόγραμμα θα μπορεί να παρουσιάζει τις εικόνες είτε με καθοριζόμενη χρονοκαθυστέρηση είτε περιμένοντας πάτημα πλήκτρου (Enter, βελάκι πάνω, κάτω (κ. λ. π ). Η λίστα των εικόνων θα μπορεί να σώζεται και να φορτώνεται ξανά. "

 

Και ήθελα να ρωτήσω σε ποιο component θα μπορούν να φορτωθούν οι εικόνες μου? Οι εικόνες θα φορτώνονται μέσα απο το pc. Έτσι έβαλα ένα main menu με File->Open. Αρχικά ξεκίνησα βάζοντας ένα List View όπου εκεί θα φορτώνονται οι εικόνες αλλα δεν γίνεται.. Μήπως θα μπορούσατε να μου δώσετε τα φώτα σας??

Δημοσ.

Μου φαίνονται λίγο αόριστα αυτά που λες για να σε βοηθήσει κάποιος συγκεκριμένα. Δεν καταλαβαίνω τι πάει να πει "φορτώνονται". Επίσης δε διευκρινίζεις σε τι είδους αρχεία εικόνας αναφέρεσαι (για BMP είναι εύκολη δουλειά, αλλά για επιπλέον format θα χρειαστείς κάποια έτοιμη βιβλιοθήκη). Το ListView δεν κατάλαβα που κολλάει.

Δημοσ.

Παιδιά με συγχωρείται για την ασάφεια μου. Γράφω σε Borland C++ Builder. Με την λέξη "φορτώνονται" εννόω ότι ο χρήστης πρέπει να έχει την δυνατότητα με την επιλογή File->Open να ανοίγει μια εικόνα (η εργασία δεν διευκρινίζει τι τύπου θα έιναι η εικόνα αλλά καλά θα ήταν να μπορεί να γίνει με όλους τους τύπους των εικόνων) απο το PC και να εμφανίζεται στην φόρμα. Το list view το χρησιμοποίησα γιατί νομίζω ότι έχει δυνατότητα να εμφανίζει σαν thumbnail και preview αλλά μάλλον έκανα λάθος όπως φαίνεται. Τι component (εργαλείο) θα χρησιμοποιήσω όπου θα εμφανίζονται οι εικόνες μου εκεί και θα μπορούν να φαίνονται σαν thumbnail η preview με το πάτημα των κατάλληλων κουμπιών φυσικά..

 

Σας ευχαριστώ προκαταβολικά.

Δημοσ.

Θες τα εξής:

 

  • TOpenPictureDialog για το File/Open
  • TListBox για τα filenames
  • TImage για την απεικόνιση του επιλεγμένου image
  • TTimer για το slideshow
  • ΤPaintBox για τα thumbnails
  • TPanel και TSplitters για το layout και το αυτόματο resizing.

 

Η περισσότερη δουλειά, δηλαδή επιλογή/preview εικόνας, λίστα εικόνων και πλήρης απεικόνιση αυτών (manually ή auto), θα γίνει σχεδόν αυτόματα, με μερικές εντολές στους κατάλληλους event handlers.

 

Θα χρειαστείς λίγες γραμμές για την απεικόνιση των thumbnails, την αλλαγή σειράς στο listbox, το keyboard, κλπ. Αν είσαι κάπως άνετος με τον Builder, σε 1 ωρίτσα είσαι έτοιμος.

Δημοσ.

[..]Το list view το χρησιμοποίησα γιατί νομίζω ότι έχει δυνατότητα να εμφανίζει σαν thumbnail και preview αλλά μάλλον έκανα λάθος όπως φαίνεται.[..]

 

Όχι δεν έχεις κάνει λάθος' date=' μπορείς να χρησιμοποιήσεις το TListView για Thumbnail preview, τόσο σε μορφή (ViewStyle) vsReport όσο και σε μορφή vsIcon, με την προϋπόθεση όμως ότι οι εικόνες θα πρέπει να αποθηκευτούν σε ένα TImageList με μεγάλες διαστάσεις (Width / Height), σε μορφή scaled (stretched) Bitmap (TBitmap).

 

Ακολουθεί ένα snapshot για να δεις πως θα μπορούσε να χρησιμοποιηθεί το TListView για image Preview, σε δυο modes λειτουργίας:

 

[center']vsIcon

 

v1m0bds5eceq1qbv9w92.png

 

 

vsReport

 

7hn0hlzijysqme009x0t.png

[/center]

 

Σημ: Φυσικά μπορείς να τοποθετήσεις JPEG στο TImageList αφού πρώτα μετατρέψεις το JPEG σε TBitmap (δες την TJPEGImage class).

Αν θες να χρησιμοποιήσεις / υποστηρίξεις περισσότερα image formats ρίξε μια ματιά στην FreeImage library (Open Source) η οποία λειτουργεί καλά με τον C++ Builder compiler / linker –αναζήτησε παλαιότερα άρθρα στο παρόν forum όπου αναλύω διεξοδικά την χρήση της FreeImage στην VCL – C++ Builder.

 

Καθώς πρόκειται για άσκηση / εργασία, και σεβόμενος την πολιτική του forum δεν μπορώ να δημοσιεύσω κώδικα αναφοράς, με λίγη εμπειρία πάνω στον C++ Builder όμως όπως είπε και ο fromaz το πρόγραμμα μπορεί να ετοιμασθεί σχετικά γρήγορα.

 

Καλή τύχη.

 

Υ.Γ.

Φυσικά η χρήση του TListView για preview μπορεί να σου κοστίσει μνήμη...

  • 3 εβδομάδες αργότερα...
Δημοσ.

Ρε παιδια πως μπορω να φορτώσω μία εικόνα σε μία image List? Θέλω μόλις φορτώνω μία εικόνα απο αρχείο (image1->picture->loadfromfile(OpenPictureDialog1->FileName) να μπαινει κατευθειαν και στην image list. Τι κομμάτι κώδικα πρέπει να γράψω?

Δημοσ.
Ρε παιδια πως μπορω να φορτώσω μία εικόνα σε μία image List? Θέλω μόλις φορτώνω μία εικόνα απο αρχείο (image1->picture->loadfromfile(OpenPictureDialog1->FileName) να μπαινει κατευθειαν και στην image list. Τι κομμάτι κώδικα πρέπει να γράψω?

 

Απλά χρησιμοποιείς το ->Add του TImageList. Στην πρώτη παράμετρο περνάς το bitmap σου στην δεύτερη NULL.

 

π.χ.:

 

>
if(OpenPictureDialog1->Execute())
 {
	Graphics::TBitmap *bmpPicture = new Graphics::TBitmap(),
					  *bmpResize = new Graphics::TBitmap();

	try
	 {
		//	Φόρτωσε την εικόνα από το TOpenPictureDialog
		bmpPicture->LoadFromFile(OpenPictureDialog1->FileName);

		/*
		 * Η εικόνα θα γίνει resize στις διαστάσεις του TImageList μας οπότε
		 * φτιάχνουμε ένα νέο Bitmap με τις διαστάσεις αυτές.
		 */
		bmpResize = new Graphics::TBitmap();
		bmpResize->Width = ImageList1->Width;
		bmpResize->Height= ImageList1->Height;

		//	Σχεδιάζουμε (StretchDraw) την εικόνα με τις νέες διαστάσεις
		bmpResize->Canvas->StretchDraw(Rect(0, 0, bmpResize->Width, bmpResize->Height), bmpPicture);
		/*
		 * Προσθέτουμε την εικόνα με τις τροποποιημένες διαστάσεις στο TImageList μας
		 * το οποίο επιστρέφει την θέση της στην λίστα.
		 */
		int	nPosition = ImageList1->Add(bmpResize, NULL);

		// Πληροφορίες ...
		ShowMessage("Picture added in ImageList1 at position #" + IntToStr(nPosition));
	}
	__finally
	 {
		// Καθαρισμός..
		delete	bmpPicture;
		delete	bmpResize;
	 }
 }

 

Υ.Γ.

Δες τον κώδικα που σου έστειλα χθες!!!!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...