[음악 연주] 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이며, 이 추리 소설이었다.