Μεταχείρηση του φορτωμένου JPEG ενός TImage ως δυαδικό αρχείο εικόνας στους Δελφούς
Ένα πρόβλημα με το συστατικό TImage είναι ότι δεν υποστηρίζει natively JPegs. Το JPeg δεν ήταν ακριβώς ως δημοφιλής ένα σχήμα πίσω στις αρχές της έως μέσης δεκαετίας του '90 όταν αναπτύχθηκαν αρχικά οι Δελφοί. Καλά, σήμερα αυτή είναι μια διαφορετική ιστορία. Αρχικό με τους Δελφούς 3, εάν η μνήμη εξυπηρετεί (όχι κάθε χρήση D2), το συστατικό TJPegImage εισήχθη και το TImage θα μπορούσε να επεκταθεί για να επιτρέψει σε JPegs για να φορτωθεί. Το σημερινό συστατικό TImage μπορεί να φορτώσει ένα JPeg κατ' ευθείαν από την εντολή LoadFromFile. Εντούτοις, δεν μπορείτε ακόμα άμεσα χειρισμένος το τόσο εύκολα όσο μπορείτε ένα δυαδικό αρχείο εικόνας. Αυτό είναι σαφές εάν εξετάζετε τη δομή της ιδιοκτησίας εικόνων ενός TImage.
Ένα TPicture έχει μια ιδιοκτησία δυαδικών αρχείων εικόνας και μια MetaFile ιδιοκτησία και μια γραφική ιδιοκτησία που αποθηκεύει όλα που δεν είναι ένα δυαδικό αρχείο εικόνας ή metafile.
Ακόμα γρήγορα θα δείτε ότι πολύ λίγες ρουτίνες και το παράδειγμα στον Ιστό εξετάζουν τη γραφική ιδιοκτησία. Δεν μπορούν! Η δομή των πληροφοριών στο γραφικό ποικίλλει ανάλογα με τον τύπο εικόνας.
Έτσι, το τέχνασμα της εξέτασης JPegs, ή τίποτ' άλλο όπως TIFFs, GIFS ή Targa (OH μου), είναι να αποκτηθούν τα στοιχεία τους ασυμπίεστα και de-συμπλεγμένα και πίσω πέρα από στην ιδιοκτησία δυαδικών αρχείων εικόνας. Ένα μικρό γνωστό γεγονός είναι ότι αυτό είναι ακριβώς αυτό που τα παράθυρα πρέπει να κάνουν οποτεδήποτε επιλέγετε ένα JPEG ως υπόβαθρο. Τα παράθυρα θα φορτώσουν το JPEG το σώζουν BMP και γράφουν στο όνομα εκείνο το BMP στο ληξιαρχείο και έπειτα την επίδειξη εκείνο το αρχείο αντί του αρχικού JPEG. Έτσι, όλοι πρέπει να εγκαταλείψουμε Borland (DevCo) για έναν klunky έλεγχο, το κάνουν ο σωστός χαμηλού επιπέδου τρόπος. Και δηλαδή σε τελευταία ανάλυση, τι συμπαθούμε για το δικαίωμα των Δελφών;
Έτσι, τι πρέπει να κάνουμε είναι μόλις επιτρέψουμε σε έναν χρήστη για να φορτώσουμε ένα αρχείο, θα ελέγξουμε για να δούμε εάν ο τύπος είναι ένα TJPegImage. Εάν είναι, κατόπιν δημιουργούμε ένα συστατικό TJPegImage. Ορίζουμε έπειτα το JPegImage στην ιδιοκτησία δυαδικών αρχείων εικόνας και γινόμαστε! Μπορείτε τώρα να έχετε πρόσβαση στα στοιχεία εικόνας στο δυαδικό αρχείο εικόνας.
Στους Δελφούς, οι οποίοι μοιάζουν με αυτό:
-
SourceImage.Picture.LoadFromFile (FullFileName)
-
εάν (SourceImage.Picture.Graphic είναι TJPegImage)
-
κατόπιν αρχίστε
-
JpegImage: = TJpegImage.Create
-
προσπαθήστε
-
JpegImage.Assign (SourceImage.Picture.Graphic)
-
SourceImage.Picture.Bitmap.Assign (JpegImage)
-
τελικά
-
τέλος
-
FreeAndNil (JpegImage)
-
τέλος
Ορίστε είναι μια θαυμάσια μικρή λειτουργία μαύρων κουτιών που χτίζεται σε πολλά αντικείμενα. Ορίστε είναι μια από τις πιό τακτοποιημένες λειτουργίες στους Δελφούς. Δέχεται βασικά άλλους τύπους αντικειμένων ως παράμετρο, και μετατρέπει όσο το δυνατόν περισσότερο εκείνου του τύπου αντικειμένου.
Πηγαίνετε αφηρημένος και πέστε εσείς έχει δύο τύπους TCar και TSuitCase αντικειμένου.
Γ: TCar
S: TSuitcase
Προφανώς δεν μπορεί να πει το S: = Γ ή Γ: = S επειδή είναι διαφορετικών τύπων.
Εντούτοις μπορείτε να πείτε
C.Assign
και μέσα του TCar ορίστε τη μέθοδο έχει μια δήλωση που μοιάζει με:
-
εάν (η πηγή είναι TSuitcase)
-
κατόπιν Self.Trunk.Contents: = Self.Trunk.Contents + TSuitcase (πηγή). Περιεχόμενο
-
αλλιώς εάν (η πηγή είναι TGasolinePump)
-
κατόπιν…
ΕΝΤΑΞΕΙ, που ηχεί την αρκετά μη-διέγερση, αλλά παίρνει καλύτερα! Τι εάν ο τύπος αντικειμένου είναι άγνωστος; Η ρουτίνα TCar μπορεί να ξέρει πώς να ορίσει ένα TFordPerfect σε το επειδή ένα TFordPerfect κληρονομεί από TCar, αλλά ένα TCar δεν πρόκειται να ξέρει πώς να ορίσει ένα TFordPrefect σε το είναι τώρα αυτό; Αυτός είναι όπου AssignTo έρχεται…
-
εάν (η πηγή είναι TSuitcase)
-
κατόπιν Self.Trunk.Contents: = Self.Trunk.Contents + TSuitcase (πηγή). Περιεχόμενο
-
αλλιώς εάν (η πηγή είναι TGasolinePump)
-
κατόπιν Self.Tank.Contents: = Self.Tank.Contents + TGasolinePump (πηγή). Γαλόνια [1]
-
άλλο Source.AssignTo (μόνο)
Το AssignTo πηγαίνει ακριβώς η ΑΝΤΙΘΕΤΗ κατεύθυνση. Το πρόσωπο που γράφει το νέο συστατικό από έπειτα δημιουργεί μια ρουτίνα που θα επιτρέψει το νέο συστατικό του στα πιό κοινά συστατικά που υπάρχουν ήδη. Έτσι μετά από το παράδειγμά μας, η ρουτίνα AssignTo TFordPrefect να περιλάβει κάτι παρεμφερή:
-
εάν (Dest είναι TCar)
-
κατόπιν TCar (Dest) .PassengerCompartment: = TCar (Dest) .PassengerCompartment + TPassenger (μόνο)
-
-
.
Ή στην περίπτωση ενός TJPegImage, οι έλεγχοι μεθόδου AssignTo βλέπουν εάν το Dest VAR είναι ένα TBitmap, και εάν είναι, περνά από μια μακροχρόνια ρουτίνα αποσυμπίεσης και μετατροπής να παραγάγει τελικά έναν αληθινό χάρτη κομματιών συσκευών ανεξάρτητο και να γράψει εκείνα τα ακατέργαστα κομμάτια στο Dest.
Και ότι οι φίλοι μου είναι πώς το συστατικό TImage μας, που δεν ξέρει τίποτα για JPEG στις μετατροπές δυαδικών αρχείων εικόνας παίρνει την εργασία γίνοντη. Ζητά τη μέθοδο TJPegImage AssignTo για να κάνει όλους εάν η εργασία του για το.
Μπορείτε τώρα να χρησιμοποιήσετε την εικόνα Picture.BitMap όπως κανονική. Το τακτοποιημένο πράγμα είναι ότι μπορείτε να βάλετε εκείνες τις ρουτίνες στη μέθοδο FormCreate σας. Έτσι, TImages μπορεί να γίνει για να περιέχει JPEGs στο χρόνο σχεδίου, που καθιστά EXE σας σημαντικά μικρότερο. Και έπειτα τους μετατρέπει, εάν κριθεί απαραίτητο, BMPs στο χρόνο εκτέλεσης. Είναι συμπαθητικό να σωθούν 600.000 του διαστήματος εικόνας δίπλα σε κανένα κόστος.
Είδος του ικανού EH;
(BTW εάν είστε πραγματικά φιλόδοξοι, είμαι βέβαιος ότι θα μπορούσατε να γράψετε εκείνη την ρουτίνα ανωτέρω έτσι ώστε ελέγχει για να σιγουρευτεί το γραφικό δεν είστε BMP, WMF ή κενός και χρησιμοποιεί έπειτα τις ρουτίνες πληροφοριών κατηγορίας για να ζητήσει από τον τύπο αντικειμένου και instationate μιας μεταβλητής TPersistent για να περιέχει ένα αντικείμενο εκείνου του τύπου. Κατόπιν η ρουτίνα σας μπορεί να χειριστεί ως δυαδικό αρχείο εικόνας ΟΠΟΙΟΔΗΠΟΤΕ τύπο εικόνας που έχετε επεκτείνει το TImage σας για να περιέχετε. Περισσότεροι να επεκτείνει TImages… αργότερα)















