>> [Музика грає]
>> ZAMYLA Чан: удар Давайте речі зі зміною розміру.
У зміні розміру, користувач буде проходити в, через командний рядок, растрове зображення,
вони хочуть масштабувати по ряд що вони також проходять в,
в командному рядку.
Як ми це робимо?
>> Ну, про все по порядку, давайте розірвати цей вниз на кроки.
Ви будете хотіти, щоб відкрити INFILE що у них є, а також
створити і відкрити OUTFILE, що ви збираєтеся поставити
Зображення зі зміненим розміром дюйма
Тоді, тому що ви зміни розміру і тому що це растровий, це заголовок, так
ви збираєтеся також оновити заголовок інформація для OUTFILE,
і пишуть, що дюйма
Тоді, ви збираєтеся читати в Scanline з INFILE,
піксель за пікселем, зміна розміру по горизонталі і писати ці пікселі в
вихідний_файл, як зазначено за шкалою користувача.
>> Ви збираєтеся забудьте додати відступи по мірі необхідності.
Детальніше про це пізніше.
А потім, також змінювати розміри по вертикалі.
ОК.
Так що це буде трохи більше складніше, ніж, хто це зробив, але
що схоже, що copy.c буде, знову ж, виявитися досить корисним.
Пам'ятайте, що copy.c відкриває файл, оновлює інформацію заголовка для
вихідний_файл, потім зчитує в рядки розгортки, піксель за пікселем, писати кожен піксель
в рядки розгортки вихідного файлу.
>> Отже, ще раз, ваш перший крок міг би, ймовірно, в тому, щоб CP, copy.c, Зміна розміру
в каталог PSET5.
Пам'ятайте, перш ніж скопіювати його, щоб переконатися, що ви розумієте,
copy.c дуже ретельно.
ОК.
>> Так що давайте відкрити файл.
Ви знаєте, як це зробити.
Я збираюся залишити це для вас.
Потім, поновіть інформацію заголовка для OUTFILE.
Тому що у нас нове растрове зображення, у нас є новий інформаційний заголовок.
Що тут змінюється?
Ну, розмір файлу буде мінятися тому що ми збираємося мати більше
пікселів, ніж раніше.
Розмір зображення, таким чином, також зміниться, як це
ширина і висота.
>> Отже, які змінні є ті, точно?
Ну, якщо ви подивитеся в заголовок інформація, ви бачите там
biSizeImage, яка представляє собою підсумок Розмір зображення в байтах,
в тому числі пікселів і доповнення.
biWidth є ширина зображення в пікселях, мінус оббивка.
biHeight це висота зображення в пікселях.
І тому ті, що містяться в Структури BITMAPFILEHEADER і
BITMAPINFOHEADER.
Ви можете сказати, який з них, які за збирається bmp.h і, дивлячись на
BITMAPINFOHEADER структура і бачення які змінні перераховані там.
>> Таким чином, щоб оновити outfiles заголовок інформація, ви будете хотіти, щоб
змінити ці значення висота і ширина.
Але швидше за все, ви, можливо, буде потрібно якийсь інформації заголовка в INFILE в
пізніше, так що краще, щоб відстежувати і інше.
Але будьте дуже ясно з вашим змінної імена, так що ви часом не
написати неправильні значення в заголовок для OUTFILE.
>> Так що тепер давайте перейдемо до читання в Scanline піксель-на-піксель.
Знову ж, ми збираємося звернутися до нашої велеречивих файл бібліотеки введення / виводу, і подивитися на
FREAD функція.
FREAD займає в покажчик на структуру , Який буде містити байти,
ви читаєте в, розмір кожної елемент, який ви читаєте -
знову, SizeOf буде корисно функціонувати тут, число
елементи розмір, розмір, що ви перебуваєте читання, і потім, нарешті,
inpointer, файл, який ви читаєте с.
Так ви приймаєте число елементів від розміру від inpointer і
покласти їх в дані.
>> Тепер прийшов час для зміни розміру по горизонталі.
якщо п одно 2, то для кожного пікселя в вхідний_файл, ми збираємося записати його
двічі у вихідний файл.
Як ми писати файли?
Ну, у нас є FWRITE функцію, тому ми взяли покажчик на структури
, Який містить байти, ви письмового, а потім ми переходимо в
Розмір, число і вихід, де ви збираєтеся писати, що.
А потім повторити процес, буде стані простий ітераційний цикл.
>> Але ми повинні пам'ятати, додати відступи дюйма
Концепція оббивка є те, що, ну, кожен піксель три укуси, але
Розмір кожної рядки належать сусла бути кратно 4 байта.
Таким чином, якщо кількість пікселів НЕ кратно 4, нам потрібно додати деякі
оббивка, який знаходиться всього в нулі.
Тепер, на відміну від, хто це зробив, і на відміну від копія, то вхідний_файл зображення і
вихідний_файл файл має різні мають відрізняється оббивка, тому що вони
різної ширини.
>> ОК.
Так що, можливо формула буде придатися тут.
Я залишу це для вас, щоб знайти його, але вам сказати, що, щоб написати оббивка,
ну, це просто проста функція fputc, що проходить в характері
що ви хочете написати, а потім покажчик файлу, який ви
хочете написати в.
Так що тепер ми змінений по горизонталі, а потім використовувати відступи,
пам'ятайте, що вам потрібно, щоб перемістити файл Індикатор положення, тому що вам
не може FREAD в доповнення.
Отже, ви хочете, щоб переконатися, що ваш файл Індикатор положення на INFILE
в правильної точки.
Тому що ми також хочемо змінити розмір по вертикалі.
Ми не можемо просто розтягнути його по горизонталі, тому що кожен потреби рядків
повинні бути скопійовані п раз.
>> Зараз є кілька різних способів зробити це.
Так що, ми можемо використовувати метод перезапису, в що ми пам'ятаємо всі пікселі
з даний рядок в масиві, і то ми пишемо цей масив як
стільки разів, скільки це необхідно.
Або є спосіб переписати де, після прочитання в один ряд у INFILE
а потім письмовій формі, що у вихідний файл, додавши заповнення, ми FSEEK
назад до початку вихідної рядка, а потім повторіть горизонтальна
зміна розміру звідти.
Незалежно від методу, тим не менш, ви будете хочу, щоб кожен піксель повторюватися
п раз, і кожен рядок буде повторюється п раз, а також.
>> При тому, що ви будете мати точковий малюнок більше, ніж життя.
Мене звуть Zamyla, і це CS50.