1 00:00:00,000 --> 00:00:10,210 >> [MUZIK Bermain] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Mari tamparan perkara dengan saiz semula. 3 00:00:13,320 --> 00:00:17,710 Dalam saiz semula, pengguna akan lulus dalam, melalui baris arahan, imej bitmap yang 4 00:00:17,710 --> 00:00:21,860 mereka mahu anda untuk skala oleh sebilangan bahawa mereka juga lulus dalam, 5 00:00:21,860 --> 00:00:23,770 dalam baris arahan. 6 00:00:23,770 --> 00:00:24,690 Bagaimana kita melakukan ini? 7 00:00:24,690 --> 00:00:28,270 >> Nah, perkara pertama yang pertama, mari kita memecahkan ini ke dalam langkah-langkah. 8 00:00:28,270 --> 00:00:31,510 Anda akan mahu untuk membuka infile yang bahawa mereka memberi anda, dan juga 9 00:00:31,510 --> 00:00:35,560 mencipta dan membuka outfile yang anda akan meletakkan 10 00:00:35,560 --> 00:00:38,020 imej saiznya masuk 11 00:00:38,020 --> 00:00:42,050 Kemudian, kerana anda saiz semula, dan kerana ia bitmap, ia header, jadi 12 00:00:42,050 --> 00:00:46,080 anda akan juga mengemaskini pengepala maklumat untuk outfile itu, 13 00:00:46,080 --> 00:00:47,950 dan menulis bahawa masuk 14 00:00:47,950 --> 00:00:51,850 Kemudian, anda akan membaca ke dalam yang scanline daripada infile itu, 15 00:00:51,850 --> 00:00:56,890 piksel demi piksel, saiz semula melintang dan menulis mereka ke dalam piksel 16 00:00:56,890 --> 00:01:00,910 outfile, sebagaimana yang dinyatakan oleh skala pengguna. 17 00:01:00,910 --> 00:01:03,940 >> Anda akan ingat untuk menambah padding seperti yang diperlukan. 18 00:01:03,940 --> 00:01:05,400 Yang akan dibincang kemudian. 19 00:01:05,400 --> 00:01:07,790 Dan kemudian, juga mengubah saiz menegak. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Jadi ini akan menjadi lebih sedikit rumit daripada yang Selesai Ia, tetapi 22 00:01:13,280 --> 00:01:18,310 apa yang sama adalah copy.c yang akan, sekali lagi, membuktikan bahawa ia amat berguna. 23 00:01:18,310 --> 00:01:23,160 Ingat bahawa copy.c membuka fail, kemaskini maklumat header untuk 24 00:01:23,160 --> 00:01:28,250 outfile, kemudian membaca ke dalam scanline itu, piksel demi piksel, menulis setiap piksel 25 00:01:28,250 --> 00:01:30,510 ke scanline fail output ini. 26 00:01:30,510 --> 00:01:37,040 >> Jadi sekali lagi, langkah pertama anda mungkin mungkin adalah untuk cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 ke dalam direktori PSET5 anda. 28 00:01:40,560 --> 00:01:43,920 Ingat walaupun, sebelum anda menyalinnya, memastikan bahawa anda memahami 29 00:01:43,920 --> 00:01:46,600 copy.c sangat teliti. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Jadi mari kita membuka fail. 32 00:01:49,880 --> 00:01:50,870 Anda tahu bagaimana untuk melakukannya. 33 00:01:50,870 --> 00:01:52,600 Saya akan meninggalkan bahawa kepada anda. 34 00:01:52,600 --> 00:01:56,050 Kemudian, kemaskinikan maklumat header untuk outfile itu. 35 00:01:56,050 --> 00:01:59,240 Kerana kita mempunyai bitmap baru, kami mempunyai maklumat header baru. 36 00:01:59,240 --> 00:02:00,970 Apakah yang berubah di sini? 37 00:02:00,970 --> 00:02:06,000 Nah, saiz fail akan berubah kerana kita akan mempunyai lebih 38 00:02:06,000 --> 00:02:07,900 piksel daripada sebelum ini. 39 00:02:07,900 --> 00:02:11,060 Saiz imej adalah, oleh itu, juga akan berubah, seperti yang 40 00:02:11,060 --> 00:02:13,050 lebar dan ketinggian. 41 00:02:13,050 --> 00:02:17,180 >> Jadi pembolehubah adalah mereka, sebenarnya? 42 00:02:17,180 --> 00:02:20,960 Nah, jika anda melihat ke dalam pengepala maklumat, anda lihat terdapat 43 00:02:20,960 --> 00:02:25,640 biSizeImage, yang merupakan jumlah yang Saiz imej dalam bait, 44 00:02:25,640 --> 00:02:28,340 termasuk pixels dan padding. 45 00:02:28,340 --> 00:02:32,520 biWidth adalah lebar imej dalam piksel, tolak padding itu. 46 00:02:32,520 --> 00:02:35,580 biHeight ialah ketinggian imej dalam piksel. 47 00:02:35,580 --> 00:02:39,200 Dan supaya orang-orang yang terkandung dalam structs BITMAPFILEHEADER dan 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Anda boleh memberitahu yang mana satu yang oleh akan bmp.h dan melihat 50 00:02:45,300 --> 00:02:49,670 Struct BITMAPINFOHEADER dan seeing pembolehubah ada disitu. 51 00:02:49,670 --> 00:02:54,700 >> Jadi untuk mengemaskini pengepala outfiles maklumat, anda akan mahu untuk 52 00:02:54,700 --> 00:02:57,025 menukar nilai-nilai daripada ketinggian dan lebar. 53 00:02:57,025 --> 00:03:00,570 Tetapi kemungkinan besar, anda ingin membuat sedikit maklumat header infile ini 54 00:03:00,570 --> 00:03:03,670 kemudian, jadi yang terbaik untuk mengesan kedua-duanya. 55 00:03:03,670 --> 00:03:07,770 Tetapi sangat jelas dengan pembolehubah anda nama-nama supaya anda tidak sengaja 56 00:03:07,770 --> 00:03:12,490 menulis nilai-nilai yang tidak betul header untuk outfile itu. 57 00:03:12,490 --> 00:03:16,160 >> Jadi sekarang mari kita untuk membaca ke dalam scanline piksel demi piksel ini. 58 00:03:16,160 --> 00:03:20,210 Sekali lagi, kita akan beralih kepada kepercayaan kami memfailkan pustaka I / O, dan melihat 59 00:03:20,210 --> 00:03:22,100 fungsi fread. 60 00:03:22,100 --> 00:03:26,150 fread mengambil masa dalam penunjuk untuk struct yang yang akan mengandungi bait yang 61 00:03:26,150 --> 00:03:30,130 anda membaca dalam, saiz setiap elemen yang anda membaca - 62 00:03:30,130 --> 00:03:34,410 sekali lagi, sizeof akan menjadi berguna berfungsi di sini, bilangan 63 00:03:34,410 --> 00:03:38,820 unsur-unsur saiz, saiz, yang anda membaca, dan kemudian akhirnya, 64 00:03:38,820 --> 00:03:41,310 inpointer, fail yang anda membaca dari. 65 00:03:41,310 --> 00:03:46,770 Jadi anda mengambil bilangan elemen saiz dari inpointer, dan 66 00:03:46,770 --> 00:03:49,040 meletakkan mereka ke dalam data. 67 00:03:49,040 --> 00:03:51,695 >> Kini sudah tiba masanya untuk mengubah saiz melintang. 68 00:03:51,695 --> 00:03:56,880 jika n bersamaan 2, maka bagi setiap piksel dalam infile, kami akan menulisnya 69 00:03:56,880 --> 00:04:00,870 dua kali dalam outfile itu. 70 00:04:00,870 --> 00:04:02,210 Bagaimana kita menulis fail? 71 00:04:02,210 --> 00:04:06,400 Nah, kita mempunyai fungsi yang fwrite, jadi kami telah mengambil penunjuk untuk struct itu 72 00:04:06,400 --> 00:04:10,170 yang mengandungi bait yang anda bertulis daripada, dan kemudian kita lulus dalam 73 00:04:10,170 --> 00:04:14,430 saiz, bilangan, dan jumlah itu, di mana anda akan menulis itu. 74 00:04:14,430 --> 00:04:19,200 Dan kemudian mengulangi proses, akan dapat satu lelaran mudah untuk gelung. 75 00:04:19,200 --> 00:04:21,740 >> Tetapi kita perlu ingat untuk menambah padding masuk 76 00:04:21,740 --> 00:04:26,040 Konsep padding ialah, baik, setiap piksel adalah tiga gigitan, tetapi 77 00:04:26,040 --> 00:04:28,940 Saiz setiap scanline kemestian menjadi gandaan 4 bait. 78 00:04:28,940 --> 00:04:33,660 Jadi, jika bilangan piksel bukan gandaan 4, kita perlu menambah beberapa 79 00:04:33,660 --> 00:04:36,630 padding, yang hanya besar sifar. 80 00:04:36,630 --> 00:04:42,130 Sekarang, tidak seperti yang Selesai Ia, dan tidak seperti salinan, kemudian imej infile dan 81 00:04:42,130 --> 00:04:44,370 file outfile telah berbeza mempunyai padding yang berbeza kerana mereka 82 00:04:44,370 --> 00:04:46,360 lebar yang berbeza. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Jadi mungkin formula yang akan sangat berguna di sini. 85 00:04:51,050 --> 00:04:55,120 Saya akan serahkan kepada anda untuk mencari ia keluar, tetapi memberitahu anda bahawa, untuk menulis padding, 86 00:04:55,120 --> 00:04:59,360 dengan baik, ia hanya satu fungsi fputc mudah, lulus dalam watak 87 00:04:59,360 --> 00:05:02,200 yang anda mahu menulis, dan kemudian penunjuk fail yang anda 88 00:05:02,200 --> 00:05:04,280 mahu menulis untuk. 89 00:05:04,280 --> 00:05:08,670 Jadi sekarang kita telah bertukar saiz mendatar, dan kemudian digunakan padding, 90 00:05:08,670 --> 00:05:12,030 ingat bahawa anda perlu bergerak fail anda penunjuk kedudukan, kerana anda 91 00:05:12,030 --> 00:05:14,480 tidak boleh fread ke padding. 92 00:05:14,480 --> 00:05:18,230 Jadi, anda ingin memastikan bahawa fail anda penunjuk kedudukan dalam infile yang 93 00:05:18,230 --> 00:05:19,980 adalah pada ketika yang betul. 94 00:05:19,980 --> 00:05:23,970 Ini kerana kita mahu mengubah saiz menegak. 95 00:05:23,970 --> 00:05:27,090 Kita tidak boleh hanya menghulurkan mendatar, kerana setiap keperluan berturut-turut 96 00:05:27,090 --> 00:05:30,370 disalin n kali. 97 00:05:30,370 --> 00:05:33,050 >> Sekarang, terdapat beberapa yang berbeza cara-cara untuk melakukan ini. 98 00:05:33,050 --> 00:05:39,010 Jadi, kita boleh menggunakan kaedah menulis semula, dalam yang kita ingat semua piksel 99 00:05:39,010 --> 00:05:42,840 satu barisan yang diberikan dalam array, dan maka kita menulis array yang sebagai 100 00:05:42,840 --> 00:05:44,730 banyak kali yang perlu. 101 00:05:44,730 --> 00:05:49,530 Atau ada kaedah recopy di mana, selepas membaca dalam satu baris dalam infile yang 102 00:05:49,530 --> 00:05:53,530 dan kemudian menulis itu ke dalam outfile itu, menambah padding, kami fseek 103 00:05:53,530 --> 00:05:57,250 belakang untuk permulaan baris asal, dan kemudian mengulangi mendatar 104 00:05:57,250 --> 00:05:58,710 saiz semula dari sana. 105 00:05:58,710 --> 00:06:02,280 Tidak kira apa kaedah, walaupun, anda akan mahu setiap piksel akan berulang 106 00:06:02,280 --> 00:06:06,370 n kali, dan setiap baris menjadi berulang kali n juga. 107 00:06:06,370 --> 00:06:09,160 >> Dengan itu, anda akan mempunyai bitmap lebih besar daripada kehidupan. 108 00:06:09,160 --> 00:06:11,760 Nama saya Zamyla, dan ini adalah CS50. 109 00:06:11,760 --> 00:06:19,542