>> [MUSIC nagpe-play]
>> ZAMYLA Chan: suntok sabihin bagay up sa Baguhin ang laki.
Sa baguhin ang laki, ay pumasa sa mga gumagamit, sa pamamagitan ng sa command line, isang bitmap imahe na
gusto nila sa iyo upang masukat sa pamamagitan ng isang numero na sila rin pumasa sa,
sa linya ng command.
Paano ang gagawin namin ito?
>> Well, unang bagay muna, sabihin masira ito down sa mga hakbang na ito.
Ikaw ay pagpunta sa nais upang buksan ang infile na bigyan sila mo, pati na rin ang
lumikha at buksan ang outfile na ka pagpunta sa ilagay ang
Binabago ang laki ng imahe in
Pagkatapos, dahil naka-pagbabago ng laki, at dahil ito ay isang bitmap, ito ang isang header, kaya
ka pagpunta upang i-update din ang header impormasyon para sa outfile,
at magsulat na in
Pagkatapos, ikaw ay pagpunta sa basahin sa ang scanline ng infile,
pixel-by-pixel, pagbabago ng laki ng pahalang at pagsusulat ng mga pixel sa
outfile, tulad ng tinukoy sa pamamagitan ng iskala ng user.
>> Ikaw ay pagpunta sa tandaan na magdagdag ng padding kung kinakailangan.
Higit sa na mamaya.
At pagkatapos, baguhin ang laki din nang patayo.
OK.
Kaya ito ay magiging isang maliit na bit higit pa kumplikado kaysa Sino ang Tapos na Ito, ngunit
kung ano ang katulad ay na copy.c pita, muli, patunayan napaka kapaki-pakinabang.
Tandaan na copy.c bubukas ang isang file, ina-update ang impormasyon ng header para sa
outfile, pagkatapos ay bumabasa sa scanline, pixel-by-pixel, pagsusulat ng bawat pixel
sa scanline ang output file.
>> Kaya muli, ang iyong unang hakbang maaari marahil maging sa CP, copy.c, resize.c
sa iyong direktoryo ng PSET5.
Tandaan bagaman, bago mo kopyahin ito, upang tiyakin na nauunawaan mo
copy.c napaka-lubusan.
OK.
>> Kaya ni magbukas ng file ipaalam.
Alam mo kung paano gawin iyon.
Pupunta ako sa umalis na sa iyo.
Susunod, i-update ang impormasyon ng header para sa outfile.
Dahil mayroon kaming isang bagong bitmap, mayroon kaming bagong impormasyon ng header.
Ano ang pagbabago dito?
Well, ang laki ng file ay pagpunta upang baguhin dahil kami ay pagpunta sa magkaroon ng higit
pixels kaysa dati.
Ang sukat ng imahe ay, sa gayon, din pagpunta sa baguhin, bilang ay ang
lapad at ang taas.
>> Kaya kung aling mga variable ay ang mga, eksakto?
Well, kung titingnan mo sa header impormasyon, tingnan mo doon ay
biSizeImage, na kumakatawan sa kabuuang laki ng imahe sa bytes,
kabilang ang mga pixel at padding.
biWidth ay ang lapad ng imahe sa pixels, minus ang padding.
biHeight ay ang taas ng ang larawan sa pixels.
At kaya iyon ay nakapaloob sa mga structs BITMAPFILEHEADER at
BITMAPINFOHEADER.
Maaari mong sabihin kung saan ang isa ay na sa pamamagitan ng pagpunta sa bmp.h at pagtingin sa mga
BITMAPINFOHEADER struct at nakakakita na mga variable ay nakalista doon.
>> Kaya upang i-update ang outfiles header impormasyon, ikaw ay pagpunta sa nais na
baguhin ang mga halaga ng taas at ang lapad.
Ngunit pagkakataon, maaaring kailangan mo ng ilang ng impormasyon ng header ang infile ni
mamaya, kaya pinakamahusay na upang masubaybayan ang pareho.
Ngunit maging napakalinaw sa iyong mga variable mga pangalan ng sa gayon ay magawa hindi sinasadyang
isulat ang hindi tamang mga halaga sa ang header para sa outfile.
>> Kaya ngayon sabihin makapunta sa pagbabasa sa ang scanline pixel-by-pixel.
Muli, kami ay pagpunta sa i sa aming mapagkakatiwalaan maghain I / O library, at tumingin sa
ang fread function.
fread tumatagal sa isang pointer sa isang struct na maglalaman ng mga bytes na
binabasa mo sa, ang laki ng bawat elemento na binabasa mo -
muli, sizeof ay magiging kapaki-pakinabang gumana dito, ang bilang ng mga
mga elemento ng laki, laki, na ikaw ay pagbabasa sa, at pagkatapos ay sa wakas, ang
inpointer, ang file na binabasa mo mula sa.
Kaya ka pagkuha ng mga elemento ng numero ng laki mula inpointer, at
paglalagay ng mga ito sa data.
>> Ngayon ay oras na upang baguhin ang laki nang pahalang.
kung n ay katumbas ng 2, pagkatapos ay para sa bawat pixel sa ang infile, kami ay pagpunta sa isulat ito
dalawang beses sa outfile.
Paano sumulat kami ng mga file?
Well, mayroon kaming mga fwrite function, kaya nagsagawa kami ng mga pointer sa struct
na naglalaman ng mga byte na ikaw ay sumusulat mula sa, at pagkatapos ay ipasa namin sa
laki, numero, at ang output, kung saan ka pagpunta sa ay sumusulat na iyon.
At pagkatapos ay upang ulitin ang isang proseso, ay magiging magagawa ng isang simpleng umuulit para sa loop.
>> Ngunit kailangan nating tandaan upang magdagdag ng padding in
Ang konsepto ng padding ay na, mahusay, bawat pixel ay tatlong kagat, ngunit ang
laki ng bawat scanline kinakailangan na multiple ng 4 bytes.
Kaya kung ang bilang ng mga pixels ay hindi isang multiple ng 4, kailangan naming magdagdag ng ilang
padding, na kung saan ay lamang zeroes.
Ngayon, hindi katulad Sino ang Tapos na Ito, at hindi magkatulad kopya, pagkatapos ay i-infile imahe at ang
outfile file na iba't ibang mayroon iba't ibang mga padding dahil hindi nila
iba't ibang mga lapad.
>> OK.
Kaya marahil isang formula ng ginagawa dumating sa madaling-gamiting dito.
Makikita ko bang iwan ito sa iyo upang hanapin ito out, ngunit sabihin mo na, magsulat ng padding,
well, ito lamang ay isang simpleng pag-andar fputc, pagpasa sa karakter
na nais mong magsulat, at pagkatapos ay ang file pointer na sa iyo
nais na magsulat sa.
Kaya ngayon na na-laki namin nang pahalang, at pagkatapos ay ginamit padding,
tandaan na kailangan mong ilipat ang iyong mga file tagapagpahiwatig ng posisyon, dahil sa iyo
Hindi maaaring fread sa padding.
Kaya nais mong tiyakin na ang iyong file tagapagpahiwatig ng posisyon sa infile
ay sa tamang punto.
Dahil kagustuhan din namin na baguhin ang laki nang patayo.
Hindi namin maaaring lamang mabatak ito nang pahalang, dahil ang bawat pangangailangan hilera
upang makopya n ulit.
>> Ngayon, mayroong maraming iba't ibang paraan upang magawa ito.
Kaya isa, maaari naming gamitin ang isang pamamaraan sa pagsulat na muli, sa na tandaan namin ang lahat ng mga pixel
ng isang naibigay na hilera sa isang array, at pagkatapos ay isulat namin na array bilang
maraming beses hangga't kailangan.
O kaya mayroong mga pamamaraan recopy kung saan, pagkatapos ng pagbabasa sa isa hilera sa infile
at pagkatapos ay sumusulat na sa outfile, pagdaragdag ng padding, fseek namin
i-back sa simula ng orihinal na sunud-sunod, at pagkatapos ay ulitin ang mga pahalang
pagbabago ng laki mula doon.
Anuman ang pamamaraan, bagaman, ikaw ay nais bawat pixel na paulit-ulit
n beses, at ang bawat hilera upang maging paulit-ulit n beses pati na rin.
>> Gamit na, magkakaroon ka ng bitmap mas malaki kaysa sa buhay.
Ang pangalan ko ay Zamyla, at ito ay CS50.