>> [MUZYKA GRA]
>> ZAMYLA Chandler: To był pani Scarlett ze świecznika.
Kryminał?
Cóż, mamy zamiar się dowiedzieć.
W Clue planszy, to polubisz nadać fizyczną czerwony obraz.
I że obraz jest bardzo czerwony i wypryskami, a twoim zadaniem jest
odsłonić ukrytą wiadomość.
I zwykle jesteś wyposażony w czerwony lupy, lub czerwony ekran
ujawniają, że ukrytą wiadomość.
Cóż, będziemy naśladować.
>> W whodunit, dostaniemy obraz bitmapowy że wygląda bardzo zawodny i czerwony,
a następnie uruchomić program kryminał ujawnić ukrytą wiadomość.
>> Więc podzielenie na etapy.
Po pierwsze, chcesz otworzyć plik - wskazówką, że już zostały podane.
A następnie również tworzyć Plik werdykt bitmapy.
Potem chcesz zaktualizować mapę bitową header informacji dla outfile werdykt.
Więcej o tym później.
A potem idziesz do zapoznania się wskazówką, linia skanująca, piksel po pikselu,
zmiana kolorów w pikselach konieczne i zapisu
tych, do wyroku -
piksel po pikselu w Werdykt linia skanująca.
>> Jak zaczniemy iść na ten temat?
Cóż, na szczęście, mamy copy.c w kodzie dystrybucji.
I to będzie udowodnić bardzo przydatne do nas.
Copy.c otwiera plik, czyta się, że Nagłówek plik_we, a następnie aktualizuje
Nagłówek plik_wy za.
A następnie odczytuje każdy piksel w linia skanująca, piksel po pikselu, a następnie
pisze, że piksel w outfile.
>> Tak więc, pierwszym krokiem może będzie uruchomić następujące
poleceń w terminalu -
cp copy.c whodunit.c.
Spowoduje to utworzenie kopii copy.c nazwie whodunit.c.
Więc nasz pierwszy krok, aby otworzyć plik, dobrze, jest dokładna
Replika, że ​​w copy.c.
Więc zostawię was patrzeć na to.
>> Co mamy do czynienia w tym pset jest Plik I / O, w zasadzie biorąc pliki,
czytanie, pisanie, ich edycji.
Jak po raz pierwszy otworzyć plik?
Cóż, masz zamiar oświadczyć plik wskaźnik, a następnie zadzwonić
Funkcja fopen.
Przejść na drodze, lub nazwy, które pliku, a następnie tryb, który chcesz
aby otworzyć dany plik w.
Przechodząc w r otworzy foo.bmp do czytania.
Natomiast fopen z przechodzącą w W będzie otwarte bar.bmp, do pisania i plik
faktycznie edycji.
>> Więc teraz, że mamy otwarty plik, nasz Następnym krokiem jest aktualizacja informacji nagłówka
dla outfile.
Co jest w informacji nagłówka?
Cóż, najpierw musimy wiedzieć, co bitmapy jest.
Mapa bitowa jest tylko prosta układ bajtów.
A oni oświadczył w tym pliku tutaj, bmp.h, z wieloma
Informacje o tym, co bitmapy faktycznie wykonane z.
Ale to, co naprawdę dbają o to Nagłówek pliku bitmapy, tutaj, i
Informacje nagłówka bitmapy, tutaj.
Nagłówek składa się z kilku zmienne, które będą bardzo przydatne.
Jest biSizeImage, który jest Całkowity rozmiar obrazu w bajtach.
I obejmuje pikseli i dopełnienie.
Tapicerka jest bardzo ważne, ale my się do tego później.
>> BiWidth reprezentuje szerokość obrazu w pikselach minus padding.
BiHeight jest to również wzrost obrazu w pikselach.
A następnie BITMAPFILEHEADER i BITMAPINFOHEADER, jak wspomniałem
wcześniej, te są reprezentowane jako elemencie.
Tak więc, nie można przejść do nagłówka pliku Sam, ale będziemy chcieli dostać się do
te zmienne wewnątrz.
>> OK.
Więc w jaki sposób zaktualizować informacje nagłówka?
Cóż, najpierw musimy sprawdzić, czy mamy trzeba zmieniać żadnych informacji od
plik_we, wskazówką, do plik_wy, werdykt.
Czy nic nie zmienia w tym przypadku?
Cóż, właściwie nie, bo będziemy się tylko zmianę barwy.
Nie jedziemy do zmiany pliku rozmiar, rozmiar, szerokość,
lub wysokość.
Więc jesteś w porządku teraz przez tylko kopiuje każdy piksel.
>> OK.
Teraz przyjrzyjmy się, jak właściwie może czytać każdy piksel z pliku.
Kolejny plik I / O funkcji będzie wchodzić w grę -
fread.
Zajmuje się wskaźnik do struktury , który zawiera bajty
czytasz.
Więc czytasz w tym.
A następnie przechodzą w rozmiarze, który jest rozmiar każdego elementu, który
chcą czytać.
Tutaj funkcja sizeof będzie przydatna.
Następnie można przejść w ilości, która oznacza liczbę elementów
Rozmiar czytać.
I wreszcie, inptr, który jest wskaźnik pliku, że jesteś
będzie czytać z.
Tak więc wszystkie te elementy są wewnątrz inptr i idą do danych.
>> Przyjrzyjmy się trochę przykład.
Jeśli chcę przeczytać w danych dwóch psów, dobrze, może to zrobić na dwa sposoby.
I można albo przeczytać w dwóch obiektów o wielkości pies z mojej inptr, czy mogę przeczytać
w jednym obiekt wielkości dwóch psów.
Więc widać, że w zależności od sposobu które organizuje rozmiar i liczbę, ty
odczytuje się w tej samej liczbie bajtów.
>> Więc teraz, zmieńmy kolor piksela, jak trzeba.
Jeśli spojrzeć na bmp.h ponownie, a następnie zobaczysz, że na dole
RGBTRIPLEs to kolejna struktura, gdzie Składają się one z trzech bajtów.
Jeden, rgbtBlue, rgbtGreen i rgbtRed.
Tak więc każdy z nich oznacza ilość niebieski, ilość zieleni, a
ilość czerwieni wewnątrz tego piksela, gdzie każda kwota jest reprezentowany przez
liczba szesnastkowa.
>> Więc ff0000 będzie kolor niebieski, bo to idzie z niebieskim,
na zielony, czerwony.
A potem wszystko f będzie biały.
Rzućmy okiem na smiley.bmp, które masz w kodzie dystrybucji.
Jeśli go otworzyć tylko w obrazie widz, to będziesz
po prostu zobaczyć czerwoną buźkę.
Ale biorąc głębsze nurkowania w, będziemy zobaczyć, że struktura
o to tylko piksele.
Mamy białe piksele, a następnie czerwone pikseli.
Biały, FFFFFF, a następnie wszystkie czerwone pikseli Mam dla Ciebie w kolorze
tu, a zobaczysz, że są 0000FF.
Zero niebieski, zero zielony, czerwony i pełna.
A ponieważ buźkę ma osiem pikseli szerokości, nie mamy żadnej wyściółki.
Dobrze.
>> Więc gdybym przypisać różne wartości do RGBTRIPLE i chciałem
sprawiają, że zielony, to co chciałbym zrobić, to Chciałbym zadeklarować RGBTRIPLE nazwie
potrójne, a następnie uzyskać dostęp do każdego bajt w tym struct I
byłoby użyć operatora kropki.
Więc triple.rgbtBlue, mogę przypisać, że na 0.
Zielona mogę przypisać go do pełna - każdy Numer, naprawdę, od 0 do FF.
A następnie czerwony, ja również powiedzieć 0.
Tak więc, że daje mi zielony piksel.
>> Następne, co, jeśli chcę, aby sprawdzić wartość czegoś?
Może mam coś, która sprawdza czy wartość potrójnej w rgbtBlue jest
FF, a następnie wydrukować, "Czuję się blue ", w wyniku.
Teraz, to nie musi oznaczać, że piksel jest czarny, tak?
Ponieważ wartości zielone i czerwone piksela może mieć także 0 wartości.
Wszystko to oznacza to, i to wszystko ta sprawdza się
o kolorze niebieskim.
Ale wszystkie pikseli może mieć także częściowe wartości kolorów, jak to
Następny przykład tutaj.
>> Jest to trochę trudniejsze, aby zobaczyć co ten obraz jest teraz.
To wygląda trochę bardziej jak clue.bmp że będziesz miał.
Teraz fizycznie, można rozwiązać ten, bo jest dużo czerwonego, przez
trzyma się czerwony ekran z obrazem tak które mogą pojawić się inne kolory.
Jak więc naśladować to z C?
Cóż, możemy usunąć wszystkie czerwone całkowicie z obrazu.
I tak zrobić, że my ustawić każdy czerwony wartość piksela na 0.
I tak obraz będzie wyglądać trochę trochę jak ten, w którym nie mamy czerwony
w ogóle.
>> Możemy zobaczyć ukrytą wiadomość trochę jaśniej teraz.
To kolejny buźkę.
A może moglibyśmy użyć innej metody.
Może moglibyśmy zidentyfikować wszystkich czerwonych pikseli -
to znaczy, wszystkie piksele w 0 niebieski, 0, zielony, czerwony i 0 -
i zmienić te do białego.
I nasz obraz może wyglądać coś takiego.
Trochę łatwiej zobaczyć.
>> Istnieje wiele innych sposobów, aby odkryć tajne wiadomości, jak również,
do czynienia z manipulacją barw.
Być może można użyć jednej z metod że wymienione powyżej.
A dodatkowo, możesz zwiększyć niektóre kolory
i postawienia się.
>> Więc teraz, że zmieniliśmy piksel kolor, obok po prostu trzeba je napisać
się do linii skanowania, piksel po pikselu.
I jeszcze raz, będziemy chcieli, aby spojrzeć wstecz do copy.c, jeśli nie zostały skopiowane
to już, i spojrzeć na fwrite funkcja, która pobiera dane, wskaźnik
do struktury zawierającej bajty że czytasz z, wielkości
przedmioty, liczba elementów, i outptr -
przeznaczenie tych plików.
>> Po pisać w pikselach, będziesz również napisać w wyściółkę.
Czym jest wypełnienie?
Cóż, każdy rgbt piksel jest trzy bajty.
Ale linia skanująca do bitmapy musi być wielokrotnością czterech bajtów.
A jeśli liczba pikseli jest wielokrotnością czterech, to musimy dodać
to wypełnienie.
Tapicerka jest tylko przedstawiciel 0s.
Tak więc, w jaki sposób napisać lub przeczytać?
Cóż, okazuje się, że nie można faktycznie fread wyściółka, ale można
obliczyć.
>> W tym przypadku, wskazówką i werdykt mają taką samą szerokość, tak
Wyściółka jest taka sama.
Oraz wyściółka, jak zobaczysz w copy.c, oblicza
z wzoru -
bi.biWidth razy sizeof (RGBTRIPLE) będzie daje nam, jak wiele bajtów bmp
zawiera w każdym wierszu.
Stamtąd modulos i odejmowanie z 4 można obliczyć
wiele bajtów, muszą być dodane tak, że bajtów na wielokrotność
każdy rząd jest cztery.
>> Teraz, gdy mamy wzór na ile wypełnienie musimy teraz
możemy ją napisać.
Teraz już wspomniałem wcześniej, Wyściółka jest zaledwie 0s.
Więc w tym przypadku, mamy tylko wprowadzenie znamienny w tym przypadku 0, w naszym
outptr - nasza plik_wy.
Tak, że może być tylko fputc 0, przecinek outptr.
>> Tak więc, podczas gdy byliśmy w naszym czytanie plik, plik I / O zachowało śledzić nasze
Stanowisko w tych plikach z czymś zwany wskaźnik pozycji pliku.
Potraktujcie to jako kursor.
Zasadniczo postępuje w każdym że fread, ale mamy
nad nim kontroli, zbyt.
>> Aby przesunąć wskaźnik pozycji pliku, można użyć fseek funkcji.
Gdzie inptr reprezentuje plik wskazówka, że ​​jesteś stara się,
Kwota jest liczba bajtów, które Aby przesunąć kursor, a następnie z
odnosi się do punktu referencyjnego skąd kursor jest.
Jeśli przechodzą w SEEK_CUR, że oznacza prąd
Pozycja w pliku.
Lub można użyć kilka innych parametrów.
Tak więc, możemy użyć fseek pominąć na dopełnienie pliku w.
I znowu, jeśli utkniesz, nie Przykład że copy.c.
>> Więc teraz mamy otwarty plik, wskazówką, a werdykt.
Mamy zaktualizowane informacje dla nagłówka Nasz werdykt, ponieważ każdy
bitmapy potrzebuje nagłówka.
Mamy wtedy odczytać na trop jest linia skanująca, piksel po pikselu, zmieniając
każdy kolor, jak jest to konieczne, a pisząc te do
Werdykt, piksel po pikselu.
Po otwarciu werdykt, który można zobaczyć winowajcą lub co tajne
Wiadomość jest.
Nazywam się Zamyla i było to kryminał.