1 00:00:00,000 --> 00:00:10,210 >> [Παίζει μουσική] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Ας χτύπημα τα πράγματα με αλλαγής μεγέθους. 3 00:00:13,320 --> 00:00:17,710 Στο resize, ο χρήστης θα περάσει, μέσω η γραμμή εντολών, μια εικόνα bitmap που 4 00:00:17,710 --> 00:00:21,860 θέλουν να αναβαθμίσουν από έναν αριθμό ότι και αυτοί θα περάσει, 5 00:00:21,860 --> 00:00:23,770 στη γραμμή εντολών. 6 00:00:23,770 --> 00:00:24,690 Πώς θα το κάνουμε αυτό; 7 00:00:24,690 --> 00:00:28,270 >> Λοιπόν, πρώτα πράγματα πρώτα, ας αναλυθεί σε βήματα. 8 00:00:28,270 --> 00:00:31,510 Θα πάμε να θέλουν να ανοίξετε το infile ότι θα σας δώσει, καθώς και 9 00:00:31,510 --> 00:00:35,560 δημιουργήσετε και να ανοίξει το outfile που θα πάμε να θέσει το 10 00:00:35,560 --> 00:00:38,020 αλλαγή μεγέθους της εικόνας μέσα 11 00:00:38,020 --> 00:00:42,050 Στη συνέχεια, επειδή είστε αλλαγή μεγέθους, και επειδή είναι ένα bitmap, είναι μια κεφαλίδα, έτσι 12 00:00:42,050 --> 00:00:46,080 θα πάμε να ενημερώσει, επίσης, την κεφαλίδα Πληροφορίες για το outfile, 13 00:00:46,080 --> 00:00:47,950 και να γράψει ότι μέσα 14 00:00:47,950 --> 00:00:51,850 Στη συνέχεια, θα πάμε να διαβάσετε σε η scanline του εσώτερου αρχείου, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, αλλαγή μεγέθους οριζόντια και το γράψιμο αυτών των pixels σε η 16 00:00:56,890 --> 00:01:00,910 outfile, όπως ορίζεται από την κλίμακα του χρήστη. 17 00:01:00,910 --> 00:01:03,940 >> Θα πάμε να θυμάστε να προσθέστε παραγεμίσματος, όπως απαιτείται. 18 00:01:03,940 --> 00:01:05,400 Περισσότερα για αυτό αργότερα. 19 00:01:05,400 --> 00:01:07,790 Και στη συνέχεια, επίσης, να αλλάξετε το μέγεθος κατακόρυφα. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Έτσι, αυτό πρόκειται να είναι λίγο πιο περίπλοκη από ό, Ποιος το κάνει, αλλά 22 00:01:13,280 --> 00:01:18,310 τι παρόμοιο είναι ότι θα copy.c, και πάλι, να αποδειχθεί πολύ χρήσιμο. 23 00:01:18,310 --> 00:01:23,160 Να θυμάστε ότι copy.c ανοίγει ένα αρχείο, επικαιροποιεί τις πληροφορίες κεφαλίδας για το 24 00:01:23,160 --> 00:01:28,250 outfile, τότε διαβάζει στο scanline, pixel-by-pixel, γράφοντας κάθε pixel 25 00:01:28,250 --> 00:01:30,510 σε scanline του αρχείου εξόδου. 26 00:01:30,510 --> 00:01:37,040 >> Έτσι και πάλι, το πρώτο σας βήμα θα μπορούσε πιθανώς να είναι σε cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 σε κατάλογο PSET5 σας. 28 00:01:40,560 --> 00:01:43,920 Να θυμάστε όμως, πριν να το αντιγράψετε, για να βεβαιωθείτε ότι έχετε κατανοήσει 29 00:01:43,920 --> 00:01:46,600 copy.c πολύ καλά. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Έτσι, ας ανοίξουμε ένα αρχείο. 32 00:01:49,880 --> 00:01:50,870 Ξέρετε πώς να το κάνουμε αυτό. 33 00:01:50,870 --> 00:01:52,600 Πάω να αφήνω σε εσάς. 34 00:01:52,600 --> 00:01:56,050 Στη συνέχεια, να ενημερώσετε τις πληροφορίες κεφαλίδας για την outfile. 35 00:01:56,050 --> 00:01:59,240 Επειδή έχουμε ένα νέο bitmap, έχουμε νέες πληροφορίες κεφαλίδας. 36 00:01:59,240 --> 00:02:00,970 Τι αλλάζει εδώ; 37 00:02:00,970 --> 00:02:06,000 Λοιπόν, το μέγεθος του αρχείου πρόκειται να αλλάξει επειδή θα πάμε να έχουν περισσότερα 38 00:02:06,000 --> 00:02:07,900 pixels ό, τι πριν. 39 00:02:07,900 --> 00:02:11,060 Το μέγεθος της εικόνας είναι, ως εκ τούτου, επίσης, πρόκειται να αλλάξει, όπως είναι η 40 00:02:11,060 --> 00:02:13,050 πλάτος και το ύψος. 41 00:02:13,050 --> 00:02:17,180 >> Έτσι που οι μεταβλητές είναι εκείνες, ακριβώς; 42 00:02:17,180 --> 00:02:20,960 Λοιπόν, αν κοιτάξετε στην κεφαλίδα πληροφορίες, θα δείτε ότι υπάρχει 43 00:02:20,960 --> 00:02:25,640 biSizeImage, η οποία αντιπροσωπεύει το συνολικό το μέγεθος της εικόνας σε bytes, 44 00:02:25,640 --> 00:02:28,340 συμπεριλαμβανομένων των pixels και padding. 45 00:02:28,340 --> 00:02:32,520 biWidth είναι το πλάτος της εικόνας σε pixels, μείον το παραγέμισμα. 46 00:02:32,520 --> 00:02:35,580 biHeight είναι το ύψος του η εικόνα σε pixels. 47 00:02:35,580 --> 00:02:39,200 Και έτσι ώστε αυτές περιέχονται στην structs BITMAPFILEHEADER και 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Μπορείτε να πείτε ποια είναι ποια από πρόκειται να bmp.h και κοιτάζοντας το 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct και βλέπουμε μεταβλητές που απαριθμούνται εκεί. 51 00:02:49,670 --> 00:02:54,700 >> Έτσι, για να ενημερώσετε την outfiles κεφαλίδα πληροφορίες, θα πάμε να θέλουν να 52 00:02:54,700 --> 00:02:57,025 αλλάξετε αυτές τις τιμές του ύψος και το πλάτος. 53 00:02:57,025 --> 00:03:00,570 Αλλά οι πιθανότητες είναι, μπορεί να χρειαστείτε κάποια των πληροφοριών κεφαλίδας του εσώτερου αρχείου του 54 00:03:00,570 --> 00:03:03,670 αργότερα, οπότε καλύτερα να παρακολουθείτε και τα δύο. 55 00:03:03,670 --> 00:03:07,770 Αλλά να είστε πολύ σαφής με την μεταβλητή ονόματα έτσι ώστε να μην κατά λάθος 56 00:03:07,770 --> 00:03:12,490 γράψτε τις λανθασμένες τιμές στις η κεφαλίδα για το outfile. 57 00:03:12,490 --> 00:03:16,160 >> Έτσι τώρα ας πάμε στην ανάγνωση σε η scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Και πάλι, θα πάμε να στραφούν σε έμπιστος μας αρχείο I / O βιβλιοθήκη, και να εξετάσουμε 59 00:03:20,210 --> 00:03:22,100 η fread λειτουργία. 60 00:03:22,100 --> 00:03:26,150 fread παίρνει σε ένα δείκτη σε μια struct η οποία θα περιέχει τα bytes που 61 00:03:26,150 --> 00:03:30,130 διαβάζετε το, το μέγεθος του κάθε στοιχείο που διαβάζετε - 62 00:03:30,130 --> 00:03:34,410 και πάλι, sizeof πρόκειται να είναι χρήσιμο λειτουργούν εδώ, ο αριθμός των 63 00:03:34,410 --> 00:03:38,820 στοιχεία της μέγεθος, το μέγεθος, ότι είστε ανάγνωση και, στη συνέχεια, τέλος, η 64 00:03:38,820 --> 00:03:41,310 inpointer, το αρχείο που διαβάζετε από. 65 00:03:41,310 --> 00:03:46,770 Έτσι παίρνετε τα στοιχεία αριθμό μεγέθους από inpointer, και 66 00:03:46,770 --> 00:03:49,040 τη θέση τους σε δεδομένα. 67 00:03:49,040 --> 00:03:51,695 >> Τώρα ήρθε η ώρα να αλλάξετε το μέγεθος οριζόντια. 68 00:03:51,695 --> 00:03:56,880 εάν το η είναι ίσο με 2, τότε για κάθε εικονοστοιχείο στην η infile, θα πάμε να το γράψω 69 00:03:56,880 --> 00:04:00,870 δύο φορές στο outfile. 70 00:04:00,870 --> 00:04:02,210 Πώς γράφουμε τα αρχεία; 71 00:04:02,210 --> 00:04:06,400 Λοιπόν, έχουμε την fwrite λειτουργία, έτσι έχουμε πάρει το δείκτη στο struct 72 00:04:06,400 --> 00:04:10,170 που περιέχει τα bytes που είστε εγγράφως από, και στη συνέχεια περνάμε 73 00:04:10,170 --> 00:04:14,430 το μέγεθος, τον αριθμό, και η έξοδος, όπου θα πάμε να γράφει αυτό. 74 00:04:14,430 --> 00:04:19,200 Και στη συνέχεια να επαναλάβει μια διαδικασία, θα είναι θέση ένα απλό επαναληπτικό βρόχο for. 75 00:04:19,200 --> 00:04:21,740 >> Αλλά πρέπει να θυμόμαστε να προσθέσει padding μέσα 76 00:04:21,740 --> 00:04:26,040 Η έννοια του padding είναι ότι, καλά, κάθε pixel είναι τρεις τσιμπήματα, αλλά η 77 00:04:26,040 --> 00:04:28,940 μέγεθος κάθε must scanline είναι πολλαπλάσιο του 4 bytes. 78 00:04:28,940 --> 00:04:33,660 Έτσι, αν ο αριθμός των εικονοστοιχείων δεν είναι ένα πολλαπλάσιο του 4, θα πρέπει να προσθέσετε κάποια 79 00:04:33,660 --> 00:04:36,630 βάτες, η οποία είναι μόλις μηδενικά. 80 00:04:36,630 --> 00:04:42,130 Τώρα, αντίθετα Ποιος το κάνει, και σε αντίθεση με αντίγραφο, τότε infile εικόνα και η 81 00:04:42,130 --> 00:04:44,370 outfile αρχείο έχουν διαφορετικά έχουν διαφορετικά padding επειδή είναι 82 00:04:44,370 --> 00:04:46,360 διαφορετικά πλάτη. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Έτσι ίσως μια φόρμουλα θα έρθει σε πρακτικό εδώ. 85 00:04:51,050 --> 00:04:55,120 Θα το αφήσουμε σε εσάς για να το μάθετε, αλλά να σας πω ότι, για να γράψει το υλικό παραγεμίσματος, 86 00:04:55,120 --> 00:04:59,360 καλά, αυτό είναι μόνο μια απλή λειτουργία fputc, περνώντας στο χαρακτήρα 87 00:04:59,360 --> 00:05:02,200 που θέλετε να γράψετε, και στη συνέχεια ο δείκτης του αρχείου που θα 88 00:05:02,200 --> 00:05:04,280 Θέλετε να γράψετε. 89 00:05:04,280 --> 00:05:08,670 Έτσι, τώρα που έχουμε αλλάξει το μέγεθός τους οριζόντια, και στη συνέχεια χρησιμοποιούνται βάτες, 90 00:05:08,670 --> 00:05:12,030 να θυμάστε ότι θα πρέπει να μετακινήσετε το αρχείο σας δείκτη θέσης, γιατί 91 00:05:12,030 --> 00:05:14,480 δεν μπορεί να Fread σε padding. 92 00:05:14,480 --> 00:05:18,230 Έτσι, θέλετε να βεβαιωθείτε ότι το αρχείο σας Ένδειξη θέση στην infile 93 00:05:18,230 --> 00:05:19,980 είναι στο σωστό σημείο. 94 00:05:19,980 --> 00:05:23,970 Επειδή θέλουμε επίσης να αλλάξετε το μέγεθος κατακόρυφα. 95 00:05:23,970 --> 00:05:27,090 Δεν μπορούμε απλά να τεντώσει οριζόντια, γιατί χρειάζεται κάθε σειρά 96 00:05:27,090 --> 00:05:30,370 να αντιγραφεί n φορές. 97 00:05:30,370 --> 00:05:33,050 >> Τώρα, υπάρχουν πολλές διαφορετικές τρόποι να γίνει αυτό. 98 00:05:33,050 --> 00:05:39,010 Έτσι, ένα, μπορούμε να χρησιμοποιήσουμε μια μέθοδο ξαναγράψει, σε ότι θυμόμαστε όλα τα εικονοστοιχεία 99 00:05:39,010 --> 00:05:42,840 από μια δεδομένη σειρά σε μία συστοιχία, και Στη συνέχεια γράφουμε ότι το array όπως 100 00:05:42,840 --> 00:05:44,730 όσες φορές χρειάζεται. 101 00:05:44,730 --> 00:05:49,530 Ή υπάρχει η μέθοδος αντιγράψει όπου, μετά την ανάγνωση σε μια σειρά στο infile 102 00:05:49,530 --> 00:05:53,530 και στη συνέχεια εγγράφως ότι στο outfile, προσθέτοντας το παραγέμισμα, που fseek 103 00:05:53,530 --> 00:05:57,250 πίσω στην αρχή της αρχικής σειράς, και στη συνέχεια επαναλάβετε την οριζόντια 104 00:05:57,250 --> 00:05:58,710 αλλαγή μεγέθους από εκεί. 105 00:05:58,710 --> 00:06:02,280 Ανεξάρτητα από τη μέθοδο, όμως, θα θέλετε κάθε pixel να επαναληφθεί 106 00:06:02,280 --> 00:06:06,370 n φορές, και κάθε σειρά για να είναι επαναλαμβάνεται n φορές, όπως καλά. 107 00:06:06,370 --> 00:06:09,160 >> Με αυτό, θα έχετε bitmap μεγαλύτερο από τη ζωή. 108 00:06:09,160 --> 00:06:11,760 Το όνομά μου είναι Zamyla, και αυτό είναι CS50. 109 00:06:11,760 --> 00:06:19,542