>> [Παίζει μουσική]
>> ZAMYLA CHAN: Ας χτύπημα τα πράγματα με αλλαγής μεγέθους.
Στο resize, ο χρήστης θα περάσει, μέσω η γραμμή εντολών, μια εικόνα bitmap που
θέλουν να αναβαθμίσουν από έναν αριθμό ότι και αυτοί θα περάσει,
στη γραμμή εντολών.
Πώς θα το κάνουμε αυτό;
>> Λοιπόν, πρώτα πράγματα πρώτα, ας αναλυθεί σε βήματα.
Θα πάμε να θέλουν να ανοίξετε το infile ότι θα σας δώσει, καθώς και
δημιουργήσετε και να ανοίξει το outfile που θα πάμε να θέσει το
αλλαγή μεγέθους της εικόνας μέσα
Στη συνέχεια, επειδή είστε αλλαγή μεγέθους, και επειδή είναι ένα bitmap, είναι μια κεφαλίδα, έτσι
θα πάμε να ενημερώσει, επίσης, την κεφαλίδα Πληροφορίες για το outfile,
και να γράψει ότι μέσα
Στη συνέχεια, θα πάμε να διαβάσετε σε η scanline του εσώτερου αρχείου,
pixel-by-pixel, αλλαγή μεγέθους οριζόντια και το γράψιμο αυτών των pixels σε η
outfile, όπως ορίζεται από την κλίμακα του χρήστη.
>> Θα πάμε να θυμάστε να προσθέστε παραγεμίσματος, όπως απαιτείται.
Περισσότερα για αυτό αργότερα.
Και στη συνέχεια, επίσης, να αλλάξετε το μέγεθος κατακόρυφα.
OK.
Έτσι, αυτό πρόκειται να είναι λίγο πιο περίπλοκη από ό, Ποιος το κάνει, αλλά
τι παρόμοιο είναι ότι θα copy.c, και πάλι, να αποδειχθεί πολύ χρήσιμο.
Να θυμάστε ότι copy.c ανοίγει ένα αρχείο, επικαιροποιεί τις πληροφορίες κεφαλίδας για το
outfile, τότε διαβάζει στο scanline, pixel-by-pixel, γράφοντας κάθε pixel
σε scanline του αρχείου εξόδου.
>> Έτσι και πάλι, το πρώτο σας βήμα θα μπορούσε πιθανώς να είναι σε cp, copy.c, resize.c
σε κατάλογο PSET5 σας.
Να θυμάστε όμως, πριν να το αντιγράψετε, για να βεβαιωθείτε ότι έχετε κατανοήσει
copy.c πολύ καλά.
OK.
>> Έτσι, ας ανοίξουμε ένα αρχείο.
Ξέρετε πώς να το κάνουμε αυτό.
Πάω να αφήνω σε εσάς.
Στη συνέχεια, να ενημερώσετε τις πληροφορίες κεφαλίδας για την outfile.
Επειδή έχουμε ένα νέο bitmap, έχουμε νέες πληροφορίες κεφαλίδας.
Τι αλλάζει εδώ;
Λοιπόν, το μέγεθος του αρχείου πρόκειται να αλλάξει επειδή θα πάμε να έχουν περισσότερα
pixels ό, τι πριν.
Το μέγεθος της εικόνας είναι, ως εκ τούτου, επίσης, πρόκειται να αλλάξει, όπως είναι η
πλάτος και το ύψος.
>> Έτσι που οι μεταβλητές είναι εκείνες, ακριβώς;
Λοιπόν, αν κοιτάξετε στην κεφαλίδα πληροφορίες, θα δείτε ότι υπάρχει
biSizeImage, η οποία αντιπροσωπεύει το συνολικό το μέγεθος της εικόνας σε bytes,
συμπεριλαμβανομένων των pixels και padding.
biWidth είναι το πλάτος της εικόνας σε pixels, μείον το παραγέμισμα.
biHeight είναι το ύψος του η εικόνα σε pixels.
Και έτσι ώστε αυτές περιέχονται στην structs BITMAPFILEHEADER και
BITMAPINFOHEADER.
Μπορείτε να πείτε ποια είναι ποια από πρόκειται να bmp.h και κοιτάζοντας το
BITMAPINFOHEADER struct και βλέπουμε μεταβλητές που απαριθμούνται εκεί.
>> Έτσι, για να ενημερώσετε την outfiles κεφαλίδα πληροφορίες, θα πάμε να θέλουν να
αλλάξετε αυτές τις τιμές του ύψος και το πλάτος.
Αλλά οι πιθανότητες είναι, μπορεί να χρειαστείτε κάποια των πληροφοριών κεφαλίδας του εσώτερου αρχείου του
αργότερα, οπότε καλύτερα να παρακολουθείτε και τα δύο.
Αλλά να είστε πολύ σαφής με την μεταβλητή ονόματα έτσι ώστε να μην κατά λάθος
γράψτε τις λανθασμένες τιμές στις η κεφαλίδα για το outfile.
>> Έτσι τώρα ας πάμε στην ανάγνωση σε η scanline pixel-by-pixel.
Και πάλι, θα πάμε να στραφούν σε έμπιστος μας αρχείο I / O βιβλιοθήκη, και να εξετάσουμε
η fread λειτουργία.
fread παίρνει σε ένα δείκτη σε μια struct η οποία θα περιέχει τα bytes που
διαβάζετε το, το μέγεθος του κάθε στοιχείο που διαβάζετε -
και πάλι, sizeof πρόκειται να είναι χρήσιμο λειτουργούν εδώ, ο αριθμός των
στοιχεία της μέγεθος, το μέγεθος, ότι είστε ανάγνωση και, στη συνέχεια, τέλος, η
inpointer, το αρχείο που διαβάζετε από.
Έτσι παίρνετε τα στοιχεία αριθμό μεγέθους από inpointer, και
τη θέση τους σε δεδομένα.
>> Τώρα ήρθε η ώρα να αλλάξετε το μέγεθος οριζόντια.
εάν το η είναι ίσο με 2, τότε για κάθε εικονοστοιχείο στην η infile, θα πάμε να το γράψω
δύο φορές στο outfile.
Πώς γράφουμε τα αρχεία;
Λοιπόν, έχουμε την fwrite λειτουργία, έτσι έχουμε πάρει το δείκτη στο struct
που περιέχει τα bytes που είστε εγγράφως από, και στη συνέχεια περνάμε
το μέγεθος, τον αριθμό, και η έξοδος, όπου θα πάμε να γράφει αυτό.
Και στη συνέχεια να επαναλάβει μια διαδικασία, θα είναι θέση ένα απλό επαναληπτικό βρόχο for.
>> Αλλά πρέπει να θυμόμαστε να προσθέσει padding μέσα
Η έννοια του padding είναι ότι, καλά, κάθε pixel είναι τρεις τσιμπήματα, αλλά η
μέγεθος κάθε must scanline είναι πολλαπλάσιο του 4 bytes.
Έτσι, αν ο αριθμός των εικονοστοιχείων δεν είναι ένα πολλαπλάσιο του 4, θα πρέπει να προσθέσετε κάποια
βάτες, η οποία είναι μόλις μηδενικά.
Τώρα, αντίθετα Ποιος το κάνει, και σε αντίθεση με αντίγραφο, τότε infile εικόνα και η
outfile αρχείο έχουν διαφορετικά έχουν διαφορετικά padding επειδή είναι
διαφορετικά πλάτη.
>> OK.
Έτσι ίσως μια φόρμουλα θα έρθει σε πρακτικό εδώ.
Θα το αφήσουμε σε εσάς για να το μάθετε, αλλά να σας πω ότι, για να γράψει το υλικό παραγεμίσματος,
καλά, αυτό είναι μόνο μια απλή λειτουργία fputc, περνώντας στο χαρακτήρα
που θέλετε να γράψετε, και στη συνέχεια ο δείκτης του αρχείου που θα
Θέλετε να γράψετε.
Έτσι, τώρα που έχουμε αλλάξει το μέγεθός τους οριζόντια, και στη συνέχεια χρησιμοποιούνται βάτες,
να θυμάστε ότι θα πρέπει να μετακινήσετε το αρχείο σας δείκτη θέσης, γιατί
δεν μπορεί να Fread σε padding.
Έτσι, θέλετε να βεβαιωθείτε ότι το αρχείο σας Ένδειξη θέση στην infile
είναι στο σωστό σημείο.
Επειδή θέλουμε επίσης να αλλάξετε το μέγεθος κατακόρυφα.
Δεν μπορούμε απλά να τεντώσει οριζόντια, γιατί χρειάζεται κάθε σειρά
να αντιγραφεί n φορές.
>> Τώρα, υπάρχουν πολλές διαφορετικές τρόποι να γίνει αυτό.
Έτσι, ένα, μπορούμε να χρησιμοποιήσουμε μια μέθοδο ξαναγράψει, σε ότι θυμόμαστε όλα τα εικονοστοιχεία
από μια δεδομένη σειρά σε μία συστοιχία, και Στη συνέχεια γράφουμε ότι το array όπως
όσες φορές χρειάζεται.
Ή υπάρχει η μέθοδος αντιγράψει όπου, μετά την ανάγνωση σε μια σειρά στο infile
και στη συνέχεια εγγράφως ότι στο outfile, προσθέτοντας το παραγέμισμα, που fseek
πίσω στην αρχή της αρχικής σειράς, και στη συνέχεια επαναλάβετε την οριζόντια
αλλαγή μεγέθους από εκεί.
Ανεξάρτητα από τη μέθοδο, όμως, θα θέλετε κάθε pixel να επαναληφθεί
n φορές, και κάθε σειρά για να είναι επαναλαμβάνεται n φορές, όπως καλά.
>> Με αυτό, θα έχετε bitmap μεγαλύτερο από τη ζωή.
Το όνομά μου είναι Zamyla, και αυτό είναι CS50.