>> [음악 연주]
>> ZAMYLA CHAN : 그것은 미스 스칼렛했다 촛대.
추리 소설?
음, 우리는 알 것입니다.
보드 게임의 단서, 당신은 수도 물리적 빨간색 이미지를 부여 할 수.
그리고 그 이미지는 매우 빨간색입니다 여드름, 당신의 작업입니다
숨겨진 메시지를 알 수있다.
그리고 일반적으로는 레드와 함께 제공하고 돋보기 나에 빨간 화면
그 숨겨진 메시지를 알 수있다.
음, 우리는 그것을 모방하는 것입니다.
>> 추리 소설에서는 비트 맵 이미지를 부여하고 즉, 매우 여드름과 붉은 보인다
다음 추리 소설 프로그램을 실행 숨겨진 메시지를 공개합니다.
>> 그럼 단계로이 작업을 중단 할 수 있습니다.
먼저, 파일을 열고 자 - 당신에게 주어진 한 단서.
그리고도를 작성 판결의 비트 맵 파일.
그럼 당신은 비트 맵을 업데이트 할 답신 OUTFILE에 대한 정보를 헤더.
나중에에 대한 자세한.
그리고 당신은에 읽을거야 단서, 주사선, 화소로 화소,
같은 화소 색 변경 필요한 쓰기
판결에 그 -
에 픽셀로 픽셀 판결의 주사선.
>> 우리는 어떻게 이것에 대해가는 시작합니까?
음, 다행히도, 우리는 copy.c이 배포 코드.
그리고 이것은 증명하는 것입니다 우리에게 아주 유용합니다.
Copy.c는 파일을 열고 그 읽고 다음 INFILE의 헤더 및 업데이트
OUTFILE의 헤더.
그리고 그것의 각 화소를 판독 다음, 주사선, 화소 별 화소 및
OUTFILE에 해당 픽셀을 기록합니다.
>> 따라서, 당신의 첫 번째 단계는 수도 다음을 실행하는
터미널에서 명령 -
CP copy.c whodunit.c.
이 복사본을 생성합니다 copy.c whodunit.c 이름.
그래서 열 수있는 우리의 첫 번째 단계 파일은 물론, 정확한 있습니다
copy.c.에서 그 복제
그래서 나는 그보고 당신을 떠날 수 있습니다.
>> 우리는이 PSET에와 있습니다 무엇을 다루고 있는지 파일 I / O, 기본적으로 파일을 가지고,
읽기, 쓰기, 그들을 편집.
어떻게 먼저 파일을 열 수 있습니까?
글쎄, 당신은 파일을 선언하는거야 포인터, 그 때 당신은 전화
함수 fopen을.
경로 또는 그 이름을 전달 파일을 누른 다음 원하는 모드
안으로 해당 파일을 열 수 있습니다
R에 전달하면 열립니다 읽기 foo.bmp.
반면 W 전달과 fopen을 것 열린 bar.bmp, 파일을 작성하고
실제로 편집.
>> 그래서 지금 우리가 파일을 연 것으로, 우리의 다음 단계는 헤더 정보를 갱신하는 것이다
OUTFILE하십시오.
헤더 정보는 무엇입니까?
음, 우리는 먼저 알아야 어떤 비트 맵입니다.
비트 맵은 간단합니다 바이트의 배열.
그리고 그들은이 파일에 선언하고 의 무리와 함께 여기 bmp.h,
어떤 비트 맵 정보 실제로에서 만들어진다.
그러나 정말 중요한 것은입니다 비트 맵 파일 헤더, 바로 여기, 그리고
여기에 비트 맵 정보 헤더.
헤더는 부부의로 구성되어 있습니다 매우 유용 할 것입니다 변수.
이다 biSizeImage가있다 바이트 이미지의 전체 크기.
그리고 이것은 픽셀 패딩이 포함되어 있습니다.
패딩은 매우 중요하지만, 우리는 나중에 얻을 수 있습니다.
>> BiWidth은의 폭을 나타냅니다 픽셀을 뺀 패딩의 이미지.
biHeight에 또한 그 높이 이미지의 픽셀.
그리고 BITMAPFILEHEADER와 내가 언급 한 바와 같이 BITMAPINFOHEADER,
이전에, 사람들은 표현됩니다 구조체로.
그래서, 당신은 파일 헤더에 액세스 할 수 없습니다 자체,하지만 당신은에 도착하는 것이 좋습니다
안쪽이 변수.
>> OK.
그렇다면 우리는 헤더 정보를 업데이트하는 방법은 무엇입니까?
음, 우리는 먼저 확인해야 할 우리의 여부 에서 정보를 변경해야
에 INFILE, 단서, OUTFILE, 판결.
무엇이든은이 경우에 변화?
음, 사실, 우리는거야 때문이 그냥 색상을 변경합니다.
우리는 파일을 변경하지 않을거야 크기, 이미지 크기, 폭,
또는 높이.
그래서 지금은 모두 맞아 다만 각 픽셀을 복사.
>> OK.
그래서 이제 어떻게 실제로 살펴 보자 파일에서 모든 픽셀을 읽을 수 있습니다.
다른 파일 I / O 함수 놀이로 올 것이다 -
FREAD.
이 구조체에 대한 포인터를 취 그 바이트를 포함하는 것
당신이 읽고있는.
그래서 당신은에 읽고.
그리고 당신은 어떤 크기로 전달 모든 요소의 크기 당신
읽고 싶어.
여기서, 함수를 sizeof 편리합니다.
그런 다음, 번호를 전달하는 의 요소의 수를 나타낸다
읽을 수있는 크기입니다.
그리고 마지막으로, inptr, 어느입니다 당신이있어 파일 포인터
읽을 것.
그래서 그 모든 요소는 내부에 inptr 그들은 데이터 것입니다.
>> 의이 작은 예를 살펴 보겠습니다.
내가 데이터를 두 개에 읽으려면 물론, 나는 그것을 두 가지 방법 중 하나를 수행 할 수 있습니다.
나도 크기의 두 개체에서 읽을 수 있습니다 내 inptr에서 개, 또는 내가 읽을 수 있습니다
하나에 두 개의 크기를 반대합니다.
그래서 당신은 참조하는 방식에 따라 당신은, 당신을 크기와 수를 준비하는 것이
동일한 수의 바이트로 읽을 수있다.
>> 그래서 이제 변경할 수 우리가 필요로하는 픽셀 컬러.
다시 bmp.h 보면 다음 당신은 하단에있는 것을 볼 수 있습니다
RGBTRIPLEs는 다른 구조체 곳 그들은 3 바이트로 구성되어 있습니다.
하나, rgbtBlue, rgbtGreen 및 rgbtRed.
따라서 이러한 각각의 양을 나타낸다 청색, 녹색의 양, 그리고
이 픽셀 안에 빨강의 양, 위치 각각의 양으로 표시됩니다
진수 숫자.
>> 그래서 FF0000은 파란색 될 것입니다, 그것은 블루에서 진행 때문에
빨간색, 녹색.
그리고 모든 F 년대 흰색이됩니다.
의이 smiley.bmp를 살펴 볼까한다 당신은 당신의 분배 코드에있다.
당신은 이미지를 열면 뷰어, 당신은거야
그냥 빨간색 웃는을 참조하십시오.
그러나 우리는거야,에 깊은 다이빙을 복용 볼이 구조
의 그냥 픽셀입니다.
우리는 흰색 픽셀이, 다음 빨간색 픽셀.
모든 후, 흰색 FFFFFF, 그리고 내가 당신을 위해있는 색깔의 한 빨간색 픽셀
여기, 당신은 그들이 0000FF입니다 것을 볼 수 있습니다.
제로 파랑, 제로, 녹색, 전체 빨간색.
그리고 웃는 여덟 픽셀 (폭)이기 때문에, 우리는 어떤 패딩이 없습니다.
괜찮아요.
>> 나는 다른 값을 할당했다 그렇다면 RGBTRIPLE에 내가 ..
그것은 녹색 확인한 다음 내가 할 것입니다 것은 나는라는 RGBTRIPLE을 선언합니다
트리플하고 모든 액세스 할 그 구조체 나는 내 바이트
도트 연산자를 사용합니다.
그래서 triple.rgbtBlue, 난 할 수 0이 할당합니다.
녹색 나는 전체에 할당 할 수 있습니다 - 어떤 번호, 정말, 0 FF 사이.
그리고 빨강, 또한 0을 말할거야.
그래서 그 날 녹색 픽셀을 제공합니다.
>> 다음으로, 무엇을 체크 할 경우 무언가의 가치인가?
나는 검사 뭔가를 할 수 트리플의 rgbtBlue 값인지
FF 다음 인쇄, "나는 느낄 수있어 블루! "결과.
자, 반드시 의미하지 않는다 픽셀 오른쪽, 파란색이라고?
픽셀의 녹색과 적색 값 때문에 또한 0이 아닌 값을 가질 수있다.
이것이 의미하는 모든 것을, 모든 것을 이는 검사한다
전체 파란색 색상.
그러나 모든 픽셀은 일부있을 수 있습니다 이 같은 색상 값,
여기에 다음 예.
>> 그것은 좀 더 열심히 볼 수의 이 이미지는 지금의.
이것은 조금 더 같이 보인다 당신이 제공됩니다 것을 clue.bmp.
이제 물리적, 당신은이 문제를 해결 수 있습니다, 으로, 빨간색이 많이 때문에
이미지에 빨간색 화면을 들고 그래서 다른 색상이 나타날 수있다.
그렇다면 우리는 C와이 모방합니까?
음, 우리는 모두 빨간색을 제거 할 수 있습니다 이미지에서 완전히.
그래서 우리는 모든 설정 것이라고 할 수 있습니다 0 픽셀의 빨강의 값.
그래서 이미지가 조금 보일 것 우리는 더 빨강이없는 곳이, 같은 비트
무엇이든지.
>> 우리는 숨겨진 메시지를 볼 수 있습니다 좀 더 명확하게 지금.
또 다른 웃는 얼굴입니다.
아니면 우리는 다른 방법을 사용할 수 있습니다.
어쩌면, 우리가 식별 할 수있는 빨간색 모든 픽셀 -
즉, 모든 픽셀과 함께합니다 0 파란, 0, 녹색, 0 빨간 -
흰색에 그 변경합니다.
그리고 우리의 이미지가 보일 수 있습니다 다음과 같이.
보고 조금 더 쉽게.
>> 발견 할 수있는 다른 방법의 제비가있다 비밀 메시지뿐만 아니라,
색 보정을 다루는.
어쩌면 당신은 방법 중 하나를 사용할 수 있습니다 I은 위에서 언급 한 것을.
그리고 또한, 당신은 할 수 있습니다 약간 색깔을 강화하는
그를 가져옵니다.
>> 그래서 지금 우리는 픽셀을 변경 한 것을 색깔은, 다음 우리는 단지 그들을 작성해야
픽셀로 스캔 라인에있는 픽셀.
그리고 다시 한번, 당신이 다시보고 할 것 당신이 복사되지 않은 경우, copy.c하기
이미, 그리고 fwrite는보고 데이터를 가져 기능, 포인터
바이트를 포함하는 구조체에 당신의 크기에서 읽는 것을
항목, 항목 수, 다음 outptr -
이러한 파일의 대상.
>> 당신은 픽셀 단위로 작성 후, 당신은거야 또한 패딩에 작성해야합니다.
패딩은 무엇입니까?
음, 모든 rgbt 픽셀 세 바이트입니다.
하지만, 비트 맵 이미지의 주사선 4 바이트의 배수가되어야한다.
화소의 개수가 아닌 경우 네의 복수는, 우리는 추가 할 필요가
이 패딩.
패딩은 단지 개로으로 표시됩니다.
그래서, 우리는 어떻게 작성하거나이를 통해 무엇을 할 수 있습니까?
글쎄요, 그것은 밝혀 할 수 없기 때문에 실제로 FREAD 패딩,하지만 당신은 할 수
를 계산합니다.
>> 이때, 실마리와 답신 폭이 동일하므로
패딩은 동일합니다.
그리고 패딩, 당신은 볼 수로 copy.c에서 계산되고,
아래의 식에 -
bi.biWidth의 배를 sizeof (RGBTRIPLE) 것 얼마나 많은 바이트 BMP 우리에게
모든 행에 있습니다.
거기에서, modulos과 뺄셈 4 계산할 수와 방법
바이트 추가해야합니다 있도록 에 바이트 체류
모든 행이 4 개입니다.
>> 이제 우리는 수식을 가지고 우리가 필요로 얼마나 많은 패딩, 지금
우리는 그것을 쓸 수 있습니다.
지금, 나는 이전에 언급, 패딩은 0S입니다.
그래서 경우에, 우리는 단지 려구요 에이 경우 0 문자, 우리의
outptr - 우리 OUTFILE.
그래서 그냥 fputc이 될 수 있습니다 0, 쉼표 outptr.
>> 그래서, 우리는에 읽어 봤는데 동안 우리의 파일, 파일 I / O는 추적을 유지하고있다 우리
뭔가 그 파일의 위치 파일 위치 표시했다.
커서로 생각합니다.
기본적으로, 그것은 모든 시간을 진행 우리는 FREAD, 그러나 우리는 가지고
도, 그것을 통해 제어 할 수 있습니다.
>> 파일 위치 표시기를 이동하려면, 당신은 함수 fseek는 사용할 수 있습니다.
inptr는 파일을 나타내고 당신이에서 찾고있는 포인터,
양 바이트 수 있다는 사실 에서 다음 커서를 이동하려면
기준점에 관한 커서가있는 곳에서.
당신이 SEEK_CUR에 전달하면, 그 전류를 의미
파일의 위치.
또는 당신은 다른 매개 변수를 사용할 수 있습니다.
그래서, 우리는 건너 fseek는 할 수 있습니다 에있는 파일의 패딩에.
당신이 붙어 있다면 다시, 거기에 copy.c.에서 그 예
>> 그래서 지금 우리가 파일을 열 었는데, 단서 및 판결.
우리의 헤더 정보를 업데이트했습니다 우리의 판결 때문에 모든
비트 맵 헤더가 필요합니다.
우리는 그 단서에 읽었습니다 주사선, 화소 픽셀의 변화
모든 색상 필요하고, 로 사람들을 작성
판결, 픽셀로 픽셀.
당신이 판결을 열면, 당신이 볼 수있는 사람 범인, 또는 어떤 비밀
메시지입니다.
내 이름은 Zamyla이며, 이 추리 소설이었다.