>> [MUZYKA GRA]
>> ZAMYLA Chandler: Miejmy cios rzeczy z rozmiaru.
W zmianą rozmiaru, użytkownik przejdzie w, poprzez linii poleceń, obraz bitmapowy, który
chcą skalowanie przez szereg że również przejść w,
w wierszu poleceń.
W jaki sposób możemy to zrobić?
>> Cóż, po pierwsze rzeczy pierwsze, niech podzielenie go na etapy.
Będziesz chciał otworzyć plik_we że dają ci, jak również
tworzyć i otwierać outfile że masz zamiar umieścić
Zmniejszone zdjęcie w.
Następnie, ponieważ jesteś zmiany rozmiaru i bo to bitmapy, to nagłówek, więc
będziesz również zaktualizować nagłówek Informacje dla pliku wynikowego,
i pisać, że w.
Potem idziesz do zapoznania się SCANLINE z pliku wejściowego,
piksel po pikselu, zmiana rozmiaru w poziomie i pisania tych pikseli w
plik_wy, jak określono według skali użytkownika.
>> Będziesz pamiętać, aby dodać dopełnienie w razie potrzeby.
Więcej o tym później.
A następnie, również zmienić rozmiar w pionie.
OK.
Więc to będzie trochę więcej skomplikowane niż Kto zrobił, ale
co podobne jest, że copy.c będzie, znowu okazać się bardzo przydatne.
Pamiętaj, że copy.c otwiera plik, aktualizuje informacje nagłówka dla
plik_wy, następnie odczytuje do scanline, piksel po pikselu, pisząc każdy piksel
do scanline pliku wyjściowego za.
>> Więc jeszcze raz, może pierwszy krok prawdopodobnie być cp, copy.c, resize.c
do katalogu PSET5.
Pamiętaj jednak, zanim go skopiować, aby upewnić się, że rozumiesz
copy.c bardzo dokładnie.
OK.
>> Warto więc otworzyć plik.
Wiesz, jak to zrobić.
Zamierzam opuścić to do ciebie.
Następnie zaktualizować informacje z nagłówka dla outfile.
Bo mamy nową bitmapę, mamy nowe informacje nagłówka.
Co się zmienia tutaj?
Cóż, rozmiar pliku się zmieni bo będziemy mieć więcej
pikseli niż wcześniej.
Rozmiar obrazu jest więc również ulegnie zmianie, co jest
szerokość i wysokość.
>> Więc, które zmienne są te, dokładnie?
Cóż, jeśli spojrzeć w nagłówku informacje, widać nie jest
biSizeImage, co stanowi sumę rozmiar obrazu w bajtach,
tym pikseli i obicia.
biWidth jest szerokość obrazu w pikselach, minus wyściółka.
biHeight jest wysokość obrazu w pikselach.
I tak te zawarte są w elemencie BITMAPFILEHEADER i
BITMAPINFOHEADER.
Można powiedzieć, który z nich jest który przez będzie bmp.h i patrząc na
BITMAPINFOHEADER struktura i widzenie które zmienne są wymienione tam.
>> Tak, aby zaktualizować outfiles nagłówek informacje, będziesz chciał
zmienić te wartości wysokość i szerokość.
Ale są szanse, może trzeba jakiś informacji w nagłówku plik_we
później, więc najlepiej, aby śledzić oba.
Ale być bardzo jasne, z zmiennej nazwy tak, że nie przypadkowo
Napisać nieprawidłowe wartości w Nagłówek dla outfile.
>> Teraz przejdźmy do czytania w SCANLINE piksel po pikselu.
Ponownie mamy zamiar włączyć do naszego trusty plik biblioteki I / O, i spojrzeć na
fread funkcji.
fread odbywa się wskaźnik do struktury , który zawiera bajty
czytasz w wielkość każdego Element, który czytasz -
kolejny sizeof będzie użyteczny funkcjonują tu szereg
elementy formatu, rozmiaru, których jesteś wczytywanie, a następnie ostatecznie
inpointer, plik czytasz od.
Więc bierzesz elementów numerycznych od wielkości i od inpointer
wprowadzenie ich do danych.
>> Teraz nadszedł czas, aby zmienić rozmiar w poziomie.
gdy n jest równe 2, to dla każdego piksela plik_we, mamy zamiar napisać
dwa razy w plik wyjściowy.
Jak piszemy pliki?
Cóż, mamy funkcję fwrite, więc podjęliśmy wskaźnik do struktury
że zawiera bajtów, że jesteś piśmie z, a następnie przechodzimy w
wielkość, ilość i moc, gdzie masz zamiar pisać, że.
A następnie powtórzyć proces, będzie stanie proste iteracyjny dla pętli.
>> Ale musimy pamiętać, dodać dopełnienie w.
Pojęcie wypełnienia jest, że dobrze, Każdy piksel ma trzy ugryzienia, ale
Rozmiar każdego moszczu Scanline być wielokrotnością 4 bajtów.
Tak więc, jeśli liczba pikseli jest wielokrotnością 4, musimy dodać kilka
wyściółka, która znajduje się zaledwie zera.
Teraz, w przeciwieństwie Kto zrobił, iw przeciwieństwie do kopię, a następnie plik_we obrazu i
plik_wy plik ma się inaczej inaczej, ponieważ są wyściółka
różne szerokości.
>> OK.
Więc może formuła się przydać tutaj.
Zostawię to do Ciebie, aby dowiedzieć się, ale powiedzieć, że do napisania dopełnienie,
dobrze, że to tylko prosta funkcja fputc, przechodząc w charakterze
, które chcesz napisać, a następnie wskaźnik pliku, który
chcę napisać do.
Więc teraz, kiedy zmieniany poziomo, , a następnie stosuje się wkładki,
pamiętaj, że trzeba przenieść plik wskaźnik położenia, ponieważ
nie może fread do wypełnienia.
Więc chcesz, aby upewnić się, że plik wskaźnik pozycji w pliku wejściowego
znajduje się w odpowiednim miejscu.
Ponieważ chcemy również rozmiar w pionie.
Nie możemy po prostu rozciągnąć poziomo, bo każdy rząd potrzebuje
do skopiowania n razy.
>> Teraz istnieje kilka różnych sposobów, aby to zrobić.
Tak jeden, możemy użyć metody przepisywania, w że pamiętamy wszystkie piksele
danego wiersza w tablicy, i Następnie piszemy tę tablicę jako
tyle razy, ile potrzeba.
Czy istnieje sposób ponownie skopiować gdzie, Po przeczytaniu w jednym rzędzie w pliku wejściowego
i piśmie, że do pliku wynikowego, dodając dopełnienie, my fseek
powrotem do początku pierwotnego rzędu a następnie powtórz poziomej
zmiana rozmiaru stamtąd.
Niezależnie od stosowanej metody, chociaż, LL aby każdy piksel być powtarzane
n razy, a każdy wiersz jest powtarzane n razy, jak również.
>> Z tym, będziesz miał bitmapy większa niż życie.
Nazywam się Zamyla, i to jest CS50.