>> [მუსიკის დაკვრა]
>> Zamyla CHAN: მოდით დარტყმა რამ ერთად ზომა.
In ზომა, მომხმარებლის გაივლის მეშვეობით ბრძანების, bitmap გამოსახულება, რომელიც
მათ მინდა მასშტაბის რიგი რომ მათ ასევე გაივლის,
ბრძანების ხაზი.
როგორ გავაკეთოთ ეს?
>> ისე, რაც პირველხარისხოვანია, მოდით დაარღვიოს ეს ქვემოთ ნაბიჯები.
თქვენ აპირებს გვინდა გახსნა infile რომ ისინი მოგცემთ, ისევე როგორც
შექმნა და გახსნა outfile, რომ თქვენ აპირებს დააყენოს
ზომა იცვლება გამოსახულება შემოსული
მაშინ, იმიტომ, რომ თქვენ resizing და იმიტომ, რომ bitmap, იგი თავით, ისე
თქვენ აპირებს ასევე განაახლოს header ინფორმაცია outfile,
და წერს, რომ შემოსული
ამის შემდეგ, თქვენ აპირებს წაიკითხა შევიდა scanline საქართველოს infile,
pixel-by-pixel, resizing ჰორიზონტალურად და წერა იმ pixels შევიდა
outfile, როგორც ეს განსაზღვრულია მომხმარებლის მიერ მასშტაბი.
>> თქვენ აპირებს გვახსოვდეს რჩეულებში padding, როგორც საჭიროა.
უფრო მოგვიანებით.
და შემდეგ, ასევე პასუხის ვერტიკალურად.
OK.
ასე რომ, ეს იქნება ცოტა მეტი რთული, ვიდრე ვინ გააკეთა ეს, მაგრამ
რა არის მსგავსი არის, რომ copy.c იქნება, ერთხელ ადასტურებს, ძალიან სასარგებლო.
გახსოვდეთ, რომ copy.c იხსნება ფაილი, განახლებები header ინფორმაცია
outfile, კითხულობს შევიდა scanline, pixel-by-pixel, წერა ყოველ pixel
შევიდა გამომავალი ფაილის scanline.
>> ასე რომ კიდევ ერთხელ, თქვენი პირველი ნაბიჯი შეიძლება, ალბათ, იყოს CP, copy.c, resize.c
თქვენს PSET5 დირექტორია.
დამახსოვრება თუმცა, სანამ კოპირება, დარწმუნდით, რომ გესმით
copy.c ძალიან საფუძვლიანად.
OK.
>> მოდით გავხსნათ ფაილი.
თქვენ იცით, როგორ უნდა გავაკეთოთ ეს.
მე ვაპირებ დატოვება, რომ თქვენ.
შემდეგი, განაახლოს header ინფორმაცია ამისთვის outfile.
იმის გამო, რომ ჩვენ გვაქვს ახალი bitmap, ჩვენ new header ინფორმაცია.
რა იცვლება აქ?
ისე, ფაილის ზომა აპირებს შეცვალოს რადგან ჩვენ ვაპირებთ უფრო მეტი
pixels, ვიდრე ადრე.
გამოსახულების ზომა არის, ამდენად, ასევე შეიცვლება, როგორც არის
სიგანე და სიმაღლე.
>> ასე რომ რაც ცვლადები არიან ისინი, ზუსტად?
ისე, თუ გადავხედავთ შევიდა header ინფორმაცია, ხედავთ არის
biSizeImage, რომელიც წარმოადგენს საერთო ზომა იმიჯი ბაიტი,
მათ შორის პიქსელი და padding.
biWidth არის სიგანე გამოსახულება პიქსელებში, მინუს padding.
biHeight არის სიმაღლე იმიჯი pixels.
და ა.შ. ეს ის შეიცავს structs BITMAPFILEHEADER და
BITMAPINFOHEADER.
თქვენ შეგიძლიათ თქვათ, რომელიც ერთი, რომელიც აპირებს bmp.h და ეძებს
BITMAPINFOHEADER struct და ხედავს რომელიც ცვლადების ჩამოთვლილი.
>> რათა განაახლოთ outfiles header ინფორმაცია, რომ თქვენ აპირებთ მინდა
შეცვლის იმ ღირებულებებს სიმაღლე და სიგანე.
მაგრამ შანსი, თქვენ ალბათ საჭიროა ზოგიერთი საქართველოს infile მიერ header ინფორმაცია
მოგვიანებით, ასე რომ, საუკეთესო ტრეკზე ორივე.
მაგრამ ძალიან მკაფიო თქვენი ცვლადი სახელები ისე, რომ თქვენ არ შემთხვევით
დაწერა არასწორი ღირებულებების header ამისთვის outfile.
>> ახლა მოდით მისაღებად კითხულობს შევიდა scanline pixel-by-pixel.
კიდევ ერთხელ, ჩვენ ვაპირებთ მივმართოთ ჩვენი სანდო ფაილის I / O ბიბლიოთეკა, და შევხედოთ
fread ფუნქცია.
fread იღებს მომცეთ struct , რომელშიც იქნება ბაიტი, რომ
თქვენ კითხულობთ წელს, ზომა თითოეული ელემენტი, რომელიც თქვენ კითხულობთ -
ერთხელ, sizeof იქნება სასარგებლო ფუნქცია აქ, ნომერი
ელემენტები ზომა, ზომა, რომ თქვენ კითხულობს, და მაშინ საბოლოოდ,
inpointer, ფაილი, რომელიც თქვენ კითხულობს დან.
ასე რომ თქვენ მიღების რაოდენობის ელემენტები ზომა მერყეობს inpointer და
აყენებს მათ მონაცემებს.
>> ახლა დროა შეცვლის ჰორიზონტალურად.
თუ n უდრის 2, მაშინ, თითოეული პიქსელის infile, ჩვენ ვაპირებთ დაწერა
ორჯერ outfile.
როგორ უნდა დაწეროთ ფაილი?
ისე, ჩვენ გვაქვს fwrite ფუნქცია, ასე რომ ჩვენ აღებული მომცეთ struct
რომელიც შეიცავს ბაიტი, რომ თქვენ წერა, და მაშინ ჩვენ კორიდორი
ზომის, რაოდენობის, და გამომავალი, სადაც თქვენ ვაპირებთ იყოს წერილობით, რომ.
და მაშინ ვიმეორებ პროცესი იქნება, შეუძლია მარტივი განმეორებითი for loop.
>> მაგრამ ჩვენ უნდა გვახსოვდეს, დაამატოთ padding შემოსული
კონცეფცია padding არის ის, რომ, ასევე, თითოეული პიქსელის სამი ნაკბენები, მაგრამ
ზომა თითოეული scanline აუცილებელია იყოს ჯერადი 4 ბაიტი.
ასე რომ, თუ ნომერი pixels არ არის მრავალჯერადი 4, საჭიროა, რომ დაამატოთ ზოგიერთი
padding, რომელიც მხოლოდ zeroes.
ახლა, განსხვავებით ვინ გააკეთა ეს, და განსხვავებით ასლი, მაშინ infile იმიჯი და
outfile ფაილი არ განსხვავდება აქვს სხვადასხვა padding რადგან ისინი
სხვადასხვა widths.
>> OK.
ასე რომ, ალბათ ფორმულა იქნება მოდის მოსახერხებელი აქ.
მე დატოვონ ეს თქვენ, რათა იპოვოს ის, მაგრამ გითხრათ, რომ დაწერა padding,
ისე, ეს მხოლოდ უბრალო fputc ფუნქცია, გავლის ხასიათი
რომ გსურთ დაწერა, ხოლო შემდეგ ფაილის კურსორი, რომ თქვენ
მინდა ვწერ.
ასე რომ, ახლა რომ ჩვენ resized ჰორიზონტალურად, და შემდეგ გამოიყენება padding,
გახსოვდეთ, რომ თქვენ უნდა გადავიდეს თქვენი ფაილი პოზიცია მაჩვენებელი, რადგან თქვენ
ვერ fread თარგმნეს padding.
ასე რომ თქვენ გვინდა დავრწმუნდეთ, რომ თქვენი ფაილი პოზიცია მაჩვენებელი infile
არის სწორი წერტილი.
იმის გამო, რომ ჩვენ ასევე გვინდა პასუხის ვერტიკალურად.
ჩვენ არ შეგვიძლია უბრალოდ მონაკვეთი მას ჰორიზონტალურად, რადგან ყველა row საჭიროებების
უნდა გადაწერა n ჯერ.
>> ახლა, არსებობს რამდენიმე სხვადასხვა გზა ამის გაკეთება.
ასე რომ, ერთი, ჩვენ შეგვიძლია გამოვიყენოთ ხელმეორე მეთოდით, რომ ჩვენ გვახსოვს ყველა pixels
მოცემული row მასივი, და მაშინ წერენ, რომ წყობის
არაერთხელ, როგორც საჭიროა.
ან იქ recopy საშუალებას სადაც, წაკითხვის შემდეგ ერთ ზედიზედ infile
და შემდეგ წერდა, რომ შევიდა outfile, დამატებით padding, ჩვენ fseek
დაბრუნება დასაწყისში ორიგინალური row, და შემდეგ გაიმეოროს ჰორიზონტალური
resizing იქიდან.
მიუხედავად მეთოდი, თუმცა, თქვენ მინდა ყველა pixel უნდა განმეორდეს
N ჯერ, და ყოველ ზედიზედ უნდა იყოს განმეორებითი N ჯერ ისევე.
>> რომ, თქვენ უნდა bitmap უფრო დიდი, ვიდრე ცხოვრებაში.
ჩემი სახელი არის Zamyla, და ეს არის CS50.