>> [Музыка гуляе]
>> 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.