1 00:00:00,000 --> 00:00:10,210 >> [Музика грає] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA Чан: удар Давайте речі зі зміною розміру. 3 00:00:13,320 --> 00:00:17,710 У зміні розміру, користувач буде проходити в, через командний рядок, растрове зображення, 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 Тоді, тому що ви зміни розміру і тому що це растровий, це заголовок, так 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 з INFILE, 15 00:00:51,850 --> 00:00:56,890 піксель за пікселем, зміна розміру по горизонталі і писати ці пікселі в 16 00:00:56,890 --> 00:01:00,910 вихідний_файл, як зазначено за шкалою користувача. 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 ОК. 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 вихідний_файл, потім зчитує в рядки розгортки, піксель за пікселем, писати кожен піксель 25 00:01:28,250 --> 00:01:30,510 в рядки розгортки вихідного файлу. 26 00:01:30,510 --> 00:01:37,040 >> Отже, ще раз, ваш перший крок міг би, ймовірно, в тому, щоб CP, copy.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 ОК. 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 Тому що у нас нове растрове зображення, у нас є новий інформаційний заголовок. 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 пікселів, ніж раніше. 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, яка представляє собою підсумок Розмір зображення в байтах, 44 00:02:25,640 --> 00:02:28,340 в тому числі пікселів і доповнення. 45 00:02:28,340 --> 00:02:32,520 biWidth є ширина зображення в пікселях, мінус оббивка. 46 00:02:32,520 --> 00:02:35,580 biHeight це висота зображення в пікселях. 47 00:02:35,580 --> 00:02:39,200 І тому ті, що містяться в Структури 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 структура і бачення які змінні перераховані там. 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 Але швидше за все, ви, можливо, буде потрібно якийсь інформації заголовка в INFILE в 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 піксель-на-піксель. 58 00:03:16,160 --> 00:03:20,210 Знову ж, ми збираємося звернутися до нашої велеречивих файл бібліотеки введення / виводу, і подивитися на 59 00:03:20,210 --> 00:03:22,100 FREAD функція. 60 00:03:22,100 --> 00:03:26,150 FREAD займає в покажчик на структуру , Який буде містити байти, 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, то для кожного пікселя в вхідний_файл, ми збираємося записати його 69 00:03:56,880 --> 00:04:00,870 двічі у вихідний файл. 70 00:04:00,870 --> 00:04:02,210 Як ми писати файли? 71 00:04:02,210 --> 00:04:06,400 Ну, у нас є FWRITE функцію, тому ми взяли покажчик на структури 72 00:04:06,400 --> 00:04:10,170 , Який містить байти, ви письмового, а потім ми переходимо в 73 00:04:10,170 --> 00:04:14,430 Розмір, число і вихід, де ви збираєтеся писати, що. 74 00:04:14,430 --> 00:04:19,200 А потім повторити процес, буде стані простий ітераційний цикл. 75 00:04:19,200 --> 00:04:21,740 >> Але ми повинні пам'ятати, додати відступи дюйма 76 00:04:21,740 --> 00:04:26,040 Концепція оббивка є те, що, ну, кожен піксель три укуси, але 77 00:04:26,040 --> 00:04:28,940 Розмір кожної рядки належать сусла бути кратно 4 байта. 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 Тепер, на відміну від, хто це зробив, і на відміну від копія, то вхідний_файл зображення і 81 00:04:42,130 --> 00:04:44,370 вихідний_файл файл має різні мають відрізняється оббивка, тому що вони 82 00:04:44,370 --> 00:04:46,360 різної ширини. 83 00:04:46,360 --> 00:04:46,690 >> ОК. 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 в доповнення. 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 повинні бути скопійовані п раз. 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 з даний рядок в масиві, і то ми пишемо цей масив як 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 а потім письмовій формі, що у вихідний файл, додавши заповнення, ми 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 Незалежно від методу, тим не менш, ви будете хочу, щоб кожен піксель повторюватися 106 00:06:02,280 --> 00:06:06,370 п раз, і кожен рядок буде повторюється п раз, а також. 107 00:06:06,370 --> 00:06:09,160 >> При тому, що ви будете мати точковий малюнок більше, ніж життя. 108 00:06:09,160 --> 00:06:11,760 Мене звуть Zamyla, і це CS50. 109 00:06:11,760 --> 00:06:19,542