[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.