1 00:00:00,000 --> 00:00:10,210 >> [MUSIC PLAYING] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Mari kita blow hal dengan resize. 3 00:00:13,320 --> 00:00:17,710 Dalam mengubah ukuran, pengguna akan lulus dalam, melalui baris perintah, gambar bitmap yang 4 00:00:17,710 --> 00:00:21,860 mereka ingin Anda untuk skala dengan nomor bahwa mereka juga lulus dalam, 5 00:00:21,860 --> 00:00:23,770 pada command line. 6 00:00:23,770 --> 00:00:24,690 Bagaimana kita melakukan ini? 7 00:00:24,690 --> 00:00:28,270 >> Nah, hal pertama yang pertama, mari kita istirahat ini menjadi langkah-langkah. 8 00:00:28,270 --> 00:00:31,510 Anda akan ingin membuka INFILE yang bahwa mereka memberi Anda, serta 9 00:00:31,510 --> 00:00:35,560 membuat dan membuka outfile yang Anda akan menempatkan 10 00:00:35,560 --> 00:00:38,020 diubah ukurannya gambar masuk 11 00:00:38,020 --> 00:00:42,050 Kemudian, karena Anda mengubah ukuran, dan karena itu bitmap, itu header, sehingga 12 00:00:42,050 --> 00:00:46,080 Anda akan juga update header Informasi untuk outfile tersebut, 13 00:00:46,080 --> 00:00:47,950 dan menulis bahwa masuk 14 00:00:47,950 --> 00:00:51,850 Kemudian, Anda akan membaca ke yang scanline dari infile tersebut, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, ukuran horizontal dan menulis mereka piksel ke dalam 16 00:00:56,890 --> 00:01:00,910 outfile, sebagaimana ditentukan dengan skala pengguna. 17 00:01:00,910 --> 00:01:03,940 >> Anda akan ingat untuk tambahkan bantalan yang diperlukan. 18 00:01:03,940 --> 00:01:05,400 Lebih pada nanti. 19 00:01:05,400 --> 00:01:07,790 Dan kemudian, juga mengubah ukuran vertikal. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Jadi ini akan menjadi sedikit lebih rumit daripada Siapa Melakukannya, tapi 22 00:01:13,280 --> 00:01:18,310 apa yang sama adalah copy.c yang akan, lagi, terbukti sangat berguna. 23 00:01:18,310 --> 00:01:23,160 Ingat bahwa copy.c membuka file, update informasi header untuk 24 00:01:23,160 --> 00:01:28,250 outfile, kemudian membaca ke scanline tersebut, pixel-by-pixel, menulis setiap pixel 25 00:01:28,250 --> 00:01:30,510 scanline ke output file. 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 juga, sebelum Anda menyalinnya, untuk memastikan bahwa 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 file. 32 00:01:49,880 --> 00:01:50,870 Anda tahu bagaimana melakukan hal itu. 33 00:01:50,870 --> 00:01:52,600 Aku akan meninggalkan itu kepada Anda. 34 00:01:52,600 --> 00:01:56,050 Kemudian, perbarui informasi header untuk outfile tersebut. 35 00:01:56,050 --> 00:01:59,240 Karena kita memiliki bitmap baru, kami memiliki info header baru. 36 00:01:59,240 --> 00:02:00,970 Apa yang berubah di sini? 37 00:02:00,970 --> 00:02:06,000 Nah, ukuran file akan mengubah karena kita akan memiliki lebih banyak 38 00:02:06,000 --> 00:02:07,900 piksel dari sebelumnya. 39 00:02:07,900 --> 00:02:11,060 Ukuran gambar adalah, dengan demikian, juga akan berubah, seperti 40 00:02:11,060 --> 00:02:13,050 lebar dan tinggi. 41 00:02:13,050 --> 00:02:17,180 >> Jadi mana variabel adalah mereka, tepatnya? 42 00:02:17,180 --> 00:02:20,960 Nah, jika Anda melihat ke header informasi, Anda melihat ada 43 00:02:20,960 --> 00:02:25,640 biSizeImage, yang merupakan total ukuran gambar dalam bytes, 44 00:02:25,640 --> 00:02:28,340 termasuk piksel dan padding. 45 00:02:28,340 --> 00:02:32,520 biWidth adalah lebar gambar dalam pixel, dikurangi padding. 46 00:02:32,520 --> 00:02:35,580 biHeight adalah ketinggian gambar dalam piksel. 47 00:02:35,580 --> 00:02:39,200 Dan mereka 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 bisa mengatakan mana yang yang oleh akan bmp.h dan melihat 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct dan penglihatan yang variabel yang terdaftar di sana. 51 00:02:49,670 --> 00:02:54,700 >> Jadi untuk memperbarui header outfiles informasi, Anda akan ingin 52 00:02:54,700 --> 00:02:57,025 mengubah nilai-nilai dari tinggi dan lebar. 53 00:02:57,025 --> 00:03:00,570 Tapi kemungkinan, Anda mungkin perlu beberapa informasi header infile ini 54 00:03:00,570 --> 00:03:03,670 kemudian, jadi terbaik untuk melacak keduanya. 55 00:03:03,670 --> 00:03:07,770 Namun sangat jelas dengan variabel Anda nama sehingga Anda tidak sengaja 56 00:03:07,770 --> 00:03:12,490 menulis nilai-nilai yang salah dalam header untuk outfile tersebut. 57 00:03:12,490 --> 00:03:16,160 >> Jadi sekarang mari kita membaca dalam yang scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Sekali lagi, kita akan beralih ke kami terpercaya file I / O perpustakaan, dan melihat 59 00:03:20,210 --> 00:03:22,100 fungsi fread. 60 00:03:22,100 --> 00:03:26,150 fread mengambil dalam pointer ke struct yang akan berisi byte yang 61 00:03:26,150 --> 00:03:30,130 Anda membaca di, ukuran masing-masing elemen yang Anda baca - 62 00:03:30,130 --> 00:03:34,410 lagi, sizeof akan berguna berfungsi di sini, nomor 63 00:03:34,410 --> 00:03:38,820 unsur ukuran, ukuran, bahwa Anda membaca, dan kemudian akhirnya, 64 00:03:38,820 --> 00:03:41,310 inpointer, file yang Anda membaca dari. 65 00:03:41,310 --> 00:03:46,770 Jadi Anda mengambil unsur nomor ukuran dari inpointer, dan 66 00:03:46,770 --> 00:03:49,040 menempatkan mereka dalam data. 67 00:03:49,040 --> 00:03:51,695 >> Sekarang saatnya untuk mengubah ukuran horizontal. 68 00:03:51,695 --> 00:03:56,880 jika n sama dengan 2, maka untuk setiap pixel dalam INFILE, kita akan menuliskannya 69 00:03:56,880 --> 00:04:00,870 dua kali dalam outfile tersebut. 70 00:04:00,870 --> 00:04:02,210 Bagaimana kita menulis file? 71 00:04:02,210 --> 00:04:06,400 Nah, kita memiliki fungsi fwrite, sehingga kami telah mengambil pointer ke struct 72 00:04:06,400 --> 00:04:10,170 yang berisi byte yang Anda menulis dari, dan kemudian kita lulus dalam 73 00:04:10,170 --> 00:04:14,430 ukuran, jumlah, dan output, di mana Anda akan menulis itu. 74 00:04:14,430 --> 00:04:19,200 Dan kemudian mengulangi proses, akan mampu yang berulang sederhana untuk loop. 75 00:04:19,200 --> 00:04:21,740 >> Tapi kita harus ingat untuk menambahkan bantalan masuk 76 00:04:21,740 --> 00:04:26,040 Konsep padding adalah bahwa, baik, setiap pixel adalah tiga gigitan, tetapi 77 00:04:26,040 --> 00:04:28,940 ukuran masing-masing scanline harus kelipatan dari 4 byte. 78 00:04:28,940 --> 00:04:33,660 Jadi jika jumlah piksel bukanlah kelipatan 4, kita perlu menambahkan beberapa 79 00:04:33,660 --> 00:04:36,630 padding, yang hanya nol. 80 00:04:36,630 --> 00:04:42,130 Sekarang, tidak seperti yang Melakukannya, dan tidak seperti copy, maka gambar INFILE dan 81 00:04:42,130 --> 00:04:44,370 File outfile telah berbeda memiliki bantalan yang berbeda karena mereka 82 00:04:44,370 --> 00:04:46,360 lebar yang berbeda. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Jadi mungkin formula akan berguna di sini. 85 00:04:51,050 --> 00:04:55,120 Aku akan menyerahkan kepada Anda untuk menemukannya, tapi memberitahu Anda bahwa, untuk menulis padding, 86 00:04:55,120 --> 00:04:59,360 baik, itu hanya fungsi fputc sederhana, lewat di karakter 87 00:04:59,360 --> 00:05:02,200 bahwa Anda ingin menulis, dan kemudian file pointer yang 88 00:05:02,200 --> 00:05:04,280 ingin menulis. 89 00:05:04,280 --> 00:05:08,670 Jadi sekarang kita sudah diubah ukurannya horizontal, dan kemudian digunakan padding, 90 00:05:08,670 --> 00:05:12,030 ingat bahwa Anda perlu untuk memindahkan file Anda indikator posisi, karena Anda 91 00:05:12,030 --> 00:05:14,480 tidak bisa fread menjadi bantalan. 92 00:05:14,480 --> 00:05:18,230 Jadi, Anda ingin memastikan bahwa file Anda indikator posisi di INFILE yang 93 00:05:18,230 --> 00:05:19,980 adalah pada titik yang benar. 94 00:05:19,980 --> 00:05:23,970 Karena kami juga ingin mengubah ukuran vertikal. 95 00:05:23,970 --> 00:05:27,090 Kita tidak bisa hanya meregangkan secara horisontal, karena setiap kebutuhan baris 96 00:05:27,090 --> 00:05:30,370 untuk disalin n kali. 97 00:05:30,370 --> 00:05:33,050 >> Sekarang, ada beberapa yang berbeda cara untuk melakukan ini. 98 00:05:33,050 --> 00:05:39,010 Jadi salah satu, kita dapat menggunakan metode menulis ulang, di bahwa kita ingat semua piksel 99 00:05:39,010 --> 00:05:42,840 dari baris tertentu dalam array, dan maka kita menulis bahwa array sebagai 100 00:05:42,840 --> 00:05:44,730 sebanyak yang diperlukan. 101 00:05:44,730 --> 00:05:49,530 Atau ada metode recopy mana, setelah membaca di salah satu baris dalam INFILE yang 102 00:05:49,530 --> 00:05:53,530 dan kemudian menulis bahwa ke outfile tersebut, menambahkan padding, kita fseek 103 00:05:53,530 --> 00:05:57,250 kembali ke awal baris asli, dan kemudian ulangi horisontal 104 00:05:57,250 --> 00:05:58,710 mengubah ukuran dari sana. 105 00:05:58,710 --> 00:06:02,280 Terlepas dari metode ini, meskipun, Anda akan ingin setiap pixel harus diulang 106 00:06:02,280 --> 00:06:06,370 n kali, dan setiap baris menjadi diulang n kali juga. 107 00:06:06,370 --> 00:06:09,160 >> Dengan itu, Anda akan memiliki bitmap lebih besar dari kehidupan. 108 00:06:09,160 --> 00:06:11,760 Nama saya adalah Zamyla, dan ini adalah CS50. 109 00:06:11,760 --> 00:06:19,542