[Powered by Google Translate] [연습 - 문제 세트 4] [Zamyla 찬 - 하버드 대학교 (Harvard University)] [이 CS50입니다. - CS50.TV] 괜찮아요. 안녕하세요 여러분, 연습 4 환영합니다. 오늘은 pset 과학 수사입니다. 과학 수사대가 비트 맵 파일을 다루는 것을 포함 정말 재미 pset입니다 범죄를 저지른 사람 발견합니다. 그럼 우리가 어떤 비트 맵 파일의 크기를 조정 할거야 그리고 우리는 또한, 복구라는 정말 재미있는 부분을 처리 할거야 있는 우리는 기본적으로 메모리 카드를 건네하고 있는 사람이 실수로 자신의 파일을 모두 삭제하였습니다, 그리고 우리는 이러한 파일을 복구하도록 요청하고 있습니다. 우리가 pset에 도착하기 전에 먼저, 정말 모든 사람들을 축하하고 싶습니다. 우리는이 과정의 중간 지점에있을거야. 퀴즈 0 우리 뒤에 있으며, 우리는 중간, 그러니 본질적으로, pset4에있다. 귀하의 psets, pset0 및 pset1로 보면 우리는 먼 길을왔다 그래서 그것에 대해 자신을 축하 그리고 우리는 정말 재미에 심취 해있을 겁니다. 그래서 pset에 대한 도구 상자, 다시 대신 얌는 sudo-Y 업데이트를 실행, 당신은 위의 기기의 버전 17.3과에 있으면 우리는 update50을 실행할 수있게되었습니다. 그럼 update50를 실행해야합니다 -이 몇 덜 자, 더 쉽게이야 - 귀하가 어플라이언스의 최신 버전에 있어요 있는지 확인합니다. 우리가 CS50 확인을 사용하기 시작하면 특히 그 update50는 중요해. 당신이 그렇게 있는지 확인하십시오. 이 pset에 대한 섹션의 모든 들어, 우리가 파일 입력 및 출력을 상대해야 할거야, 파일 I / O. 우리는 배열을 처리 프로그램의 많은 반복해야 할거야 파일 및 그와 같은 일을 가리키는 그래서 우리는 우리가 친숙하고 편안한 있는지 확인하려면 어떻게 파일로 입력 및 출력에 대응. 이 pset에 대한 유통 코드에 copy.c라는 파일입니다 그 우리에게 정말 도움이 될 것입니다 우리가 찾을 수있을 것입니다 우리가 끝장 때문에 실제로 copy.c 파일을 복사 불과 약간 문제 집합의 처음 2 부품을 달성 할 수 있도록을 변경. 내가 전에 언급 한대로 그리고 그때, 우리는 비트 맵뿐만 아니라 JPEG 파일을 다루는됩니다. 그래서 정말, 그 파일이 구성되는 방법의 구조를 이해 우리가 정말 structs에 0s와 1 초를 번역 할 수있는 방법 우리가 실제로 이해하고 해석하고 편집 할 수있는 건, 그건 정말 중요한 것입니다 그래서 JPEG 및 비트 맵 파일로 가서 그의 구조를 이해. Pset4, 항상 그렇지만, 질문 섹션을 시작합니다. 이러한 파일 I / O 처리하고 그에 익숙해 얻을 것이다. 그런 다음 1 부 당신이 비트 맵 파일을 제공하고있는, 추리 소설입니다 그게 전부 위에 빨간 점처럼 가지 보입니다. 그리고 기본적으로 우리가 어떻게 할 거냐이 파일을 가지고 단지 약간 편집 is 우리가 읽을 수있는 버전으로. 기본적으로, 우리는 우리가 동일한 파일을주지 완료 를 제외하고 우리는 그 붉은 점으로 숨겨져 숨겨진 메시지를 볼 수 있습니다. 그런 다음 크기 조정이 파일을 주어진있는 프로그램입니다 다음은 출력 한 파일의 이름을 부여하고,뿐만 아니라 번호를 부여 실제로 정수 값으로 해당 비트 맵의​​ 크기를 조정합니다. 그런 다음 마지막으로, 우리는 회복의 pset 있습니다. 우리는 메모리 카드를 제공하고 모든 사진을 복구 할되어 있습니다 실수로 삭제 된 즉, 우리가 배울 수로하지만, 실제로 삭제 파일에서 제거되지 않습니다; 그들은 파일에 갔던 곳의 우리는 그냥 종류 잃었지만 우리는 그렇게 복구거야. 좋아요. 따라서 사용하겠다고 함수의 전체 목록은 I / O는 특별히이이 파일에 들어갔습니다. 당신은 이미 약간의 fopen의 기본, fread, fwrite를하고, 본 그러나 우리는 일부 파일을 추가로 보는거야 I / 등 fputc와 같은 O 기능, 하는 당신은 한 번에 하나의 문자를 쓰기 당신이 친절 앞으로 및 뒤로 파일 위치 지시자를 이동의, fseek로 그리고 몇몇 다른. 그러나 우리는 pset 동안 조금 나중에 들어갈 수 있습니다. 그래서 일단, 그냥 파일로 받아 I / O 우리는 pset로 이동하기 전에, 파일을 열 예를 들어, 당신이해야 할 일은 실제로 파일에 대한 포인터를 설정합니다. 그래서 우리는 파일 * 포인터가 있습니다. 그건 내 infile 될거야 있기 때문에이 경우, 내가 포인터에 전화 했어. 그래서 난 함수 fopen 다음 파일의 이름을 사용하는거야 그리고 나는 갈거야하는 모드는 파일을 처리 할 수​​ 있습니다. 따라서 읽기이 경우 "R", 작문에 대해 "w", 그리고 첨부의 "이"가 있습니다. 예를 들어, 때 infile 상대하고 그리고 당신이 원하는 모든이가 저장된 비트와 바이트를 읽어 그런 다음 당신은 아마 당신의 모드로 "R"을 사용하려는거야. 당신이 실제로 기록 할 때, 가지 새 파일을 만들어 그리고 우리가 할 수있는 일은은 우리가 새로운 파일을 열 것 때문이다 와 쓰기에 대해 "w"모드를 사용합니다. 그럼 당신은 실제로 파일로 읽을 때, 구조는 다음과 같습니다. 먼저 당신이 읽고있는 바이트를 포함 할 구조체에 포인터가 포함되어 있습니다. 그럼 그 말은 당신이 읽고있는 바이트의 끝 위치거야. 그런 다음 크기를 표시하는 것 같은 기본적으로 얼마나 많은 바이트 프로그램이 파일에 읽기 있으며, 크기는 기본적으로 하나의 요소는, 그리고 당신이 읽고 싶은 얼마나 많은 요소를 지정하는거야. 그리고 마지막으로, 당신은 어디에서 읽고 어디에 있는지 알고 있어야 하거든 그래서 귀하의 포인터거야. fread는 fwrite 매우 유사합니다 때문에이를 색상 코딩 당신이 올바른 순서를 사용하고 있는지 확인하려면 제외 당신이 실제로 작성하거나 오른쪽 파일에서 읽고 있는지 확인하십시오. 그럼 우선, 우리는 요소의 크기뿐만 아니라 요소의 수를 가지고 있다면, 그러면 우리는 여기에 약간의 주위에 재생할 수 있습니다. 나는 개 구조체가 있고 그래서 내가 한 번에 두 개를 참조하세요 말해봐. 내가 할 수있는 것은 한 요소의 크기 떠는 것 뿐이은 한 개의 크기가 될거야 그리고 실제로 두 가지를 읽을거야. 또는 내가 할 수있는 건 단 하나의 요소를 읽을거야 떠는 것 뿐이 한 요소는 두 개의 크기가 될 것입니다. 그래서 그런 유사한 방법은 당신이 크기와 수 주변에 놀이의 종류 수 당신에게 더 직관적인지에 따라 다릅니다. 괜찮아요. 이제 우리는 서면 파일을 얻을. 자네가 읽고있는 당신은 파일을 기록 할 때, 첫번째 인자는 실제로 있습니다. 그래서, 당신은 파일에 쓸 계획하는 기본적으로 데이터의 마지막에 아웃 포인터가있는 것입니다. 그래서 당신은 pset를 처리 할 때, 당신이 혼란스러워하지 않도록합니다. 어쩌면 측에 의해 정의 측면이 있습니다. 당신은 예를 들어, 사람을 입력하여 설명서에 정의를 당겨하고 fwrite 수 있습니다 터미널에서, 또는이 슬라이드로 참조 할 수 있습니다 하고 오른쪽 하나를 사용하고 있는지 확인하십시오. 그러니 다시 fwrite를 들어, 파일이 때로 작성하려는 그 마지막 인자 될거야하고 ​​해당 파일에 대한 포인터가 생길거야. 그래서 그건 우리가 한 번에 아마도 몇 바이트를 작성하는 처리 방법 하지만 당신이 지금 하나의 단일 문자로 작성하려면 말한다. 우리가이 예제에서 나중에 볼 수 있듯이, 비트 맵에서 우리는 것을 사용해야합니다. 우리가 fputc 사용할 수있을 때 정말, 본질적으로 단지 chr은 한 번에 한 문자를 넣어 이 파일 포인터에, 그게 우리의 아웃 포인터. 그래서 우리는 찾거나 파일에 쓸 때마다 파일이 우리가있는 곳을 추적하는 데있다. 그럼 커서 파일 위치 지시자의 일종입니다. 그리고, 우리는 쓸 때마다 또는 파일로 다시 읽기 그곳이 어딘지 파일이 실제로 기억 그리고 이제 커서가있는 곳에서 계속됩니다. 당신이 원하는 때 뭔가를 특정 금액 읽고, 말, 도움이 될 수 있습니다 후, 다음 금액을 읽을 하지만 때때로 우리는 특정 기준 값에서 시작 다시하거나 실제로 이동 할 수 있습니다. 그래서 fseek 함수는, 만약 잘못된 것은 우리가 특정 파일에 커서를 이동할 수 있습니다 바이트의 특정 번호입니다. 그리고 우리가해야 할 일은 참조 값은 위치를 지정할 수 있습니다. 그럼 하나는, 커서는 현재 위치에서 앞이나 뒤로 이동 또는 우리는 단지 파일의 시작 부분에서 이동해야 지정할 수 있습니다 또는 파일의 끝에서. 그리고 당신은 금액에 제외 나 긍정적 인 값을 전달할 수 있습니다 그리고 그 가지 중 앞 또는 뒤로 커서를 이동합니다. 우리가 다른 psets으로 시작하기 전에, 파일에 대한 질문이 I / O? 좋아요. 우리가 더 많은 예제에 들어가으로 질문 날 막을 주시기 바랍니다. 따라서 추리 소설에, 당신이 슬라이드에있는이 붉은 비슷한 비트 맵 파일을 넘겨있어, 그리고은 다음과 같습니다 - 붉은 점의 무리 - 그리고 당신은 정말 서면 건지 모르겠어요. 당신은 곁눈질하면 중간 안에 약간 푸른 색을 볼 수 있습니다. 텍스트가 저장되어있는 위치 기본적으로, 그입니다. 이 일 살인 사건이었고, 우리는 그런 짓을했는지 밝혀 낼해야합니다. 그렇게하기 위해, 우리는 읽을 수있는 형식으로 이미지를 변환의 정도 필요합니다. 당신들이이가 발생하는 경우, 때때로 약간의 키트가 될 어디서 붉은 필름에 돋보기를해야한다. 누구? 그래. 따라서이 같은 손으로 뭔가있을거야, 당신은 돋보기가 것 위에 빨간색 필름으로, 당신은 이미지 위에 넣어 것입니다 당신은 메시지가 그 안에 숨겨져 볼 수있을 것입니다. 우리는 붉은 필름과 돋보기가 없기 때문에 대신에 우리는 예전의 우리가 직접 만들 수의가는거야 이 pset 인치 그리고 사용자는 다음 입력 추리 소설, 단서에 갈 수 있습니다. BMP는, 빨간 점으로 메시지입니다 infile이고, 그래서 그리고 그들은 verdict.bmp 우리 outfile 될 것입니다 말씀하시는 거예요. 그래서 단서 하나와 유사한 새로운 비트 맵 이미지를 만들거야 읽을 수있는 형식으로 제외하고있는 우리는 숨겨진 메시지를 볼 수 있습니다. 우리는 어떤 종류의 비트 맵을 편집 및 조작을 상대해야 할거야 때문에 우리는 이러한 비트 맵 파일의 구조로의 다이빙 종류에가는거야. 우리는 강의에서이 약간 넘는 갔지만, 좀 더 그들에 대해 조사합시다. 비트 맵은 본질적으로 바이트 단지 배치 아르 우리가 지정한 곳하는 바이트 무엇 의미합니다. 자, 이제 비트 맵 이미지의지도처럼 가지입니다 그 어떤 헤더 파일로 시작한다는, 거기에 몇 가지 정보와 함께 시작합니다. 당신은에 대한 바이트 번호 14의 크기는 비트 맵 이미지의 표시되는 것을 볼 그리고에 계속됩니다. 하지만 우리가 여기서 관심은 바이트 수가 54 주위에 시작합니다. 우리는이 RGB의 트리플 있습니다. 하려는 일을하면 실제 픽셀의 색상 값을 포함합니다. 헤더에 그 위의 모든 몇 가지 정보입니다 이미지, 이미지의 폭과 높이의 크기에 해당. 우리가 나중에 패딩으로 들어갈 때, 우리는 볼 이유가 이미지의 크기 폭 또는 높이가 다를 수 있습니다. 그럼 다음을 나타냅니다 방법 -이 비트 맵 이미지를 바이트 시퀀스 있습니다 - 괜찮아,라고되어 우리가 할 수있는 건, 기억 할거야 그 인덱스 14, 우리가이 쉽게하기 위해 어떻게 할 거냐 대신 크기가 예를 들어, 어디에 만, 구조체에 캡슐화되어 있습니다. 그래서 우리는 우리 둘이서 연애 structs, BITMAPFILEHEADER이 와 BITMAPINFOHEADER, 그래서 우리가 그 파일에 읽기 때마다 기본적으로는 순서대로가는거야 그리고 순서에 또한 biWidth와 biSize 등의 변수에의 기입 할거야. 그리고 마지막으로, 모든 픽셀은 세 바이트로 표현됩니다. 첫 번째는 픽셀의 파란색의 양이고, 두 번째는 녹색의 양입니다 마지막으로, 0은 본​​질적으로 더 블루 또는 전혀 녹색입니다 붉은 색의 금액이나 레드 그리고 FF는 최대 값입니다. 다음은 16 진수 값입니다. 우리가 FF0000이있는 경우 그럼, 해당 파란색의 최대 금액에 해당하는 그리고 녹색과 레드 때문에 해당이 우리에게 파란 픽셀을 제공하지 않을 없습니다. 우리는 보드에서 FF의 모든 경우, 그러면 우리가 흰색 픽셀을 가지고 있다는 것을 의미합니다. 우리가 RGB 말을 할 때 일반적으로에 반대 종류의 것입니다. 사실은 BGR을거야. 우리가 실제로 비트 맵 이미지의 예를 조사다면 - 내가 여기를 하세. 조금 작 네요. 나는 확대, 우리는 그것이 pixelated있어 볼 수 있습니다. 그것은 색의 블록 것 같습니다. 그런 다음 흰색 블록과 빨간 블록을 갖추고 있습니다. 당신이 Microsoft 그림판에서 재생하는 경우, 예를 들어, 당신은 그런 일을 만들 수 에 의해 기본적으로는 특정 순서로 특정 사각형을 그림. 그래서 비트 맵의​​에 대한 어떤이 번역은 다음과 같습니다 수 있습니다. 여기 우리는 6 F의 것을 먼저 흰색 픽셀을 가지고 있고, 그런 다음에 우리가 붉은 색 픽셀이 0000FF으로 표시. 그리고 우리가 가지고 바이트의 시퀀스는 비트 맵 이미지가 꼴 방법을 나타냅니다. 그래서 여기 한 것은 바로 모든 바이트를 작성하고 빨간색으로 한 다음 색 어떤 종류의 볼 수 있도록의 종류 웃는 얼굴을 나타냅니다 방법을 곁눈질 조금, 경우. 비트 맵 이미지 작업을 나야하는 방법은 그리드로 기본적를 구상. 그리고 기본적으로 그리드의 모든 행은 4 바이트의 배수 여야합니다. 우리가 비트 맵 이미지를 보면, 당신은 모든 값에 작성하고 있습니다. 예를 들어, 당신은 여기, 여기, 여기, 파란색 녹색 빨간색이있을 수 하지만 이미지가 4 바이트의 배수으로 채워되어 있는지 확인해야합니다. 나는 세 블록 폭이 될 수있는 이미지를하려는 경우 그럼, 난 빈 값을 넣어해야 마지막에 네 분이 여러 수 있도록하고 있습니다. 그래서 나는 우리가 패딩 전화하는거야 뭔가를 추가합니다. 난 그냥 거기에 X로 표시 할거야. 지금은 우리가 예를 들어, 7 픽셀 긴 이미지를 원하는 말한다. 우리는 1, 2, 3, 4, 5, 6, 7을 가지고 그 모두 색으로 가득 차 있습니다. 비트 맵 이미지가 작동하는 방식은 우리가 여덟째을해야한다는 것입니다. 지금 우리는 1, 2, 3, 4, 5, 6, 7을 갖추고 있습니다. 우리는 올바르게 읽을 수있는 비트 맵 이미지 8 공간이 필요합니다. 그럼 우리가해야 할 일 패딩 조금에 추가됩니다 폭의 유니폼되었는지 확인하려면 그리고 너비의 모든 4의 배수임을. 그래서 나는 이전에 X 또는 구불 구불 한 선으로 패딩, 표시 하지만 실제 비트 맵 이미지에 패딩은 16 진수 0으로 표시됩니다. 그래서 하나의 문자, 0이 될 것입니다. 어떤 쓸모가있을 것이 xxd 명령입니다. 만약 성공하지 건 내가 웃는으로 이전 한 것과 유사 실제로 당신을 보여줍니다 같다 사실은 각 색상의 픽셀을위한 일하는지 알아 인쇄 할 때 다음 명령을 xxd 실행할​​ 때 다음, 그것을 색 다음은 실제로 색상이 해당 픽셀에 대한 어떤 인쇄합니다. 당신이해야 할 일은-S 54처럼, 나는 표시 이쪽에 나는 54번째 바이트에서 시작 할거야 있다고 우리가 비트 맵의​​지도로 돌아 보면 그 이전 있기 때문에 기억 그렇게 헤더 정보와 물건은 자네입니다. 하지만 우리가 정말 신경하면 색상을 나타내는 실제 픽셀입니다. 그래서,-S 54 그 플래그에 추가하여, 우리는 색상 값을 볼 수있게되었습니다. 그리고 그 같은 복잡한 국기와 일에 대해 걱정하지 마십시오. 문제 세트 사양에서는 픽셀을 표시 할 수 xxd 사용하는 방법에 대한 지시 사항을해야합니다. 당신이 여기서 보는면, 그것은 종류의 녹색 상자,이 작은 일 것 같습니다. 나는 기본적으로 더 파랑, 녹색의 많은, 그리고 더 붉은 말을하지로 00FF00을 색으로했습니다. 그래서 녹색에 해당합니다. 당신이 여기서 보는 바와 같이, 우리는 녹색 사각형을 참조하십시오. 이 녹색 사각형은 우리가 뭘해야하는지 그럼, 단 3 픽셀 폭 이미지는 4 폭의 배수인지 확인하는 것은 추가 패딩에 추가됩니다. 그리고 해당 당신이 여기이 0s를 볼 방법은 다음과 같습니다. 이와 같은 사실은 실제로 당신의 크기 조정 pset의 결과입니다 기본적으로 작은 비트 맵을 복용 한 후 4하여 확대. 그리고 우리가 볼 것은, 실제로이 이미지는 12 픽셀 (폭)입니다하지만, 12는 4의 배수이다 우리가 어떤을 추가 할 필요가 없기 때문에 그래서 우리는 실제로 끝에서 어떤 0s 표시되지 않습니다 은 완전히 패드를 물렸다이 없기 때문입니다. 그것은 더 이상 공간이 없습니다. 좋아요. 패딩에 대한 질문? 좋아요. 좋아. 내가 전에 언급 한 바와 같이, 비트 맵은 바이트의 순서입니다. 그리고 우리가해야하는 것은 아닌 바이트의 정확히 어떤 수를 추적 할 필요입니다 특정 요소에 해당하는, 우리는 실제로를 대표하는 구조체를 만들었습니다. 그래서 우리가하는 것은 RGBTRIPLE 구조체입니다. 당신이 RGB 트리플의 인스턴스를 가지고 때마다, 이 유형의 구조체를 정의하기 때문에, 다음은 rgbtBlue 변수에 액세스 할 수 있습니다 표시됩니다 마찬가지로 녹색 및 빨간색 변수, 얼마나 파랑, 녹색, 빨간색, 각각이 있습니다. 우리는 0, FF의 녹색 세트, 파란색 변수 세트를 가지고면 어느 당신이 가진 수있는 최대 값으로, 다음 빨간색 변수는 0으로 설정 그리고 무슨 색이 특정 RGB 트리플는 대표까요? >> [학생] 그린. 그린. 그렇지. 알면 도움이 될거야 당신이 RGB 트리플의 인스턴스가있을 때마다 , 푸른 녹색, 빨간색 - - 개별적으로 당신은 실제로 색상의 양을 액세스 할 수 있습니다. 이제 우리는 그 구조에 대해 이야기하는, 그럼 BMP 파일을 살펴 보자. 이 당신을 위해 만든 structs입니다. 여기 BITMAPFILEHEADER 구조체의 수 있습니다. 관심의 크기입니다. 나중에, 우리는 우리에게 흥미 몇 가지 더있는 정보 헤더를,이 즉 크기, 폭 및 높이입니다. 우리가 나중에 들어가 겠지만,이 파일을 읽었을 때, 가 자동으로 우리가 동일 할 순서를 설정 한 때문으로 읽습니다. 따라서 biSize은 이미지의 실제 크기에 해당하는 권리 바이트를 포함합니다. 우리가 얘기 한 것처럼 그리고 여기 마지막으로, 우리는 RGBTRIPLE typedef 구조체가 있습니다. 우리는과 관련 rgbtBlue, 녹색, 빨간색을 갖추고 있습니다. 좋아요. 좋아요. 이제 비트 맵을 좀 이해, 우리는 파일 헤더를 가지고 이해 그리고 그것으로하고 그 후 관련 정보 헤더는, 우리는 흥미로운 물건이 색상, 이러한 색상은 RGBTRIPLE structs에 의해 나타내어진다 저들은 차례로, 녹색, 파란색, 그리고 빨간색으로 연결된 세 값을 가진다. 이제, 우리는 약을 조금 복구 생각의 종류 수 있습니다. 미안 해요. 추리 소설에 대해 생각해보십시오. 우리 단서 파일이 때 다음 우리가 원하는 것은 그것 픽셀의 픽셀에서 읽어 우리가 읽을 수있는 형식으로 출력 할 수 있도록하고 어떻게 든 그 픽셀을 변경할 수 있습니다. 그리고 그것을 출력하기 위해 verdict.bmp 파일에 픽셀이 픽셀을 쓸거야. 그해야 할 많은 종류의 있습니다. 우리는 그렇게 알고 있습니다. 그래서 우리가 한 것은 우리가 실제로 당신을 제공합니다 copy.c. 어떤 copy.c이 수행하는 것은 단지 주어진 비트 맵 파일의 정확한 복사본을 만들어 다음을 출력합니다. 그래서이 이미 당신을 위해 파일을 열 픽셀에서 픽셀로 읽 다음 출력 파일에에 씁니다. 씨가를 살펴 보자. 이것은 적절한 사용을 보장합니다 여기에 파일 이름을 받고. 이게 않는 것은 우리가 여기 infile에서의 통과했는지로 입력 파일을 설정 is 이는 우리의 두번째 명령 줄 인수입니다. 우리가 파일을 열 수 있는지 확인하기 위해 확인합니다. 우리가 여기에서 새 outfile을 만들 수 있도록 확인합니다. 그런 다음이 여기에 무엇을, 그냥 기본적으로 처음부터 비트 맵 파일에 읽기 시작합니다. 시작은 우리가 알다시피, BITMAPFILEHEADER를 포함 그래서 비트있는 시퀀스 직접 BITMAPFILEHEADER을 작성합니다. 그래서 우리가 여기있는 것은 그 BITMAPFILEHEADER BF 말을합니다 - 그건 형 BITMAPFILEHEADER의 새로운 변수 있어요 - 우리가 포인터에서에서 읽어 BF 안에 넣어 것, 즉 우리 infile입니다. 우리는 얼마나 읽습니까? 우리는 전체 BITMAPFILEHEADER를 포함 할 필요가 얼마나 많은 바이트 읽어보십시오. 마찬가지로, 그 정보를 헤더에 대해 우리가 할 일을 한거야. 그래서 우리는, infile에서 우리의 파일을 함께 지속적으로 우리는 이러한 비트와 바이트를 읽을, 우리는에 직접 연결해하고 우리가 만드는하고있는 변수의 이러한 경우에. 여기 우리가 비트 맵은 비트 맵인지 확인하고 있어요. 이제 우리는 오른쪽 outfile 있나요? 우리가 그것을 만들 때 서 있도록, 그것은 기본적으로 비어 있습니다. 그래서 우리는 기본적으로 처음부터 새로운 비트 맵을 만들 수 있습니다. 우리가 할 일은 우리가 파일 헤더에 복사되었는지 확인해야 해 불과 infile 같은 정보 헤더가 있습니다. 와 BF가 변수입니다 기억 - 우리가 할 일은 우리가 쓸 수 있습니다 유형 BITMAPFILEHEADER의, 우리가 할 것은 우리가 그 콘텐츠를 사용할 수 있습니다 있도록 outfile로 작성할 수 있습니다. 여기, 우리가 패딩 얘기를 기억 우리가 가지고 픽셀의 양이 4의 배수인지 확인하는 것이 중요합니다 방법. 이렇게하면 얼마나 패딩 계산 매우 유용 할 공식이에요 파일의 폭 주어진. 나는 너희들이 copy.c에 우리가 패딩을 계산하기위한 공식을 기억하고 싶습니다. 알았어? 그래서 모두가 기억이. 좋아요. 그럼 copy.c은 무엇을 다음은 scanlines의 전부를 반복합니다. 그것은 첫째 행지나 다음되는지 모든 트리플을 저장 다음 outfile에 기록합니다. 그래서 여기에 우리는 한 번에 하나의 RGB 트리플을 읽고 다음 outfile에 같은 트리플를 넣어. 까다로운 부분은 패딩이 RGB 트리플하지 않습니다 것입니다 그래서 우리는 RGB의 트리플의 패딩 금액을 읽을 수 없습니다. 우리가해야 할 일은 실제로, 우리의 파일 위치 지시자를 이동의 커서를 이동하기 우리가 다음 행에 있어요 있도록 모든 패딩 건너 뛰는 종류의 있습니다. 그리고이 무엇을 복사하면 패딩을 추가 할 수 방법을 보여줍니다 것입니다. 그래서 우리는, 우리가 필요로 얼마나 많은 패딩 계산 한 그래서 우리는 0s의 패딩 번호가 필요합니다 것을 의미합니다. 이게 않는 것은 우리 outfile에 0s의 패딩 번호를 놓고 루프를위한 것입니다. 그리고 마지막으로, 당신은 두 파일을 닫습니다. 당신은 infile뿐만 아니라 outfile을 닫습니다. 그래서 그런 방법은 copy.c 작품 그리고 그게 매우 유용 할 것 같네요. 대신 실제로 직접 복사하고 붙여 넣기의 또는, 그걸보고 당신이 원하는대로에서 입력 당신은, 터미널에서이 명령을 실행 할 수도 있습니다 새 파일이 생성됩니다 CP copy.c whodunit.c, whodunit.c, 그 사본이 그렇듯 동일한 콘텐츠가 포함되어 있습니다. 그럼 우리가 할 수있는 일을 프레임 워크로하는에 구축하고 편집 할 수있는 사용하고 있습니다 우리의 추리 소설 파일. 이 분들은 우리 투 - 업무는 추리 소설을 위해 무엇을해야하지만, 어떤 copy.c합니까 사실 우리에게 대부분을 담당하고 있습니다. 그래서 우리가 다음 할 필요가 모든 필요에 따라 픽셀을 바꾸는 거죠 실제로 파일을 읽을 수 있도록하고 있습니다. 유형 RGBTRIPLE 주어진 변수 때문에, 트리플 주어진 픽셀에 대한 그 기억, 당신은 파란색, 녹색, 붉은 색 값을 액세스 할 수 있습니다. 그건 유용 거에요 당신이 그들을 액세스 할 수있는 경우 때문에, 그 말은 당신이 또한 그들을 확인할 수 있다는 것을 의미 그리고 그 말은 당신도 변경할 수 있다는 것을 의미합니다. 그래서 우리는 우리의 붉은 색 돋보기 예로 돌아 갔을 때, 기본적으로 그건 우리에게 필터의 일종의 역할을했다. 그래서 우리가 원하는 것은 우리가 들어오고있어 트리플 모든 필터링 싶은 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 기본적으로, 당신은 당신이 원하는 필터의 어떤 유형의 수 있습니다. 아마 당신은 모두 빨간 픽셀을 변경하려면 어쩌면 당신은 다른 색상에 다른 색상 픽셀을 변경하고 싶습니다. 그게 당신에게 달려 있습니다. 당신은 픽셀이 무슨 색 확인할 수 있습니다 기억 당신이 힘든로 그리고 당신은 또한을 변경할 수 있습니다. 좋아요. 그래서 그런 추리 소설입니다. 일단 추리 소설을 실행, 당신은 범죄의 범인이 누구인지 알 수 있습니다. 이제 우리는 크기 조정 갈거야. 우리는 여전히 비트 맵 처리 할거야. 우리가 할 수있는 일은 우리가 입력 비트 맵을 할거야 그리고 우리는 번호를 전달하고 outfile 비트 맵을받을거야 그는 기본적으로 N으로 확장 우리 infile 어디. 내 파일이 하나의 픽셀 큽니다 말해. 제 n은 3 세, 스케일링했다하면, 그럼 난, 시간의 픽셀 N 번호를 반복 것 그래서 3 번하고도뿐만 아니라 3 번 내려 확장. 그래서 당신은 내가 아니라 수평 수직으로 잘 축소있어 참조하십시오. 그리고 여기에는 예입니다. 당신은 N = 2를 사용하는 경우 첫 번째 파란색 픽셀은 두 번이 반복 것을 볼 가로로 두 배 수직뿐만 아니라. 그리고 그 말은 계속하고, 그렇게 두하여 원본 이미지의 직접적인 스케일링을 갖추고 있습니다. 우리가이에 대한 세부 의사를 만약에 그렇다면, 우리는 파일을 엽니 다하고 싶습니다. 그리고, 우리가 돌​​아 가면 걸 알면서 우리는 outfile의 너비가 infile에 대한 폭 다를 것입니다 것을 볼 수 있습니다. 그게 무슨 뜻 이죠? 그건 우리의 헤더 정보가 변경되는 것을 의미합니다. 그리고 우리가하고 싶은 것하면 헤더 정보를 업데이트입니다 당신이 copy.c 프레임 워크에서 작동하는 경우 우리가 파일에 읽을 때 걸 알면서, 우리는 이미 크기가 뭔지 나타냅니다 그 등 변수가 있습니다. 그럼 일단 당신이해야 할 수도 있습니다하는 것은 그 특정 변수를 변경할 수 있으며, 처리해야합니다. 당신이 구조체가있을 경우 해당 내의 변수에 액세스하는 방법, 기억하십시오. 당신이 바로 도트 연산자를 사용할 수 있습니까? 그를 사용하여 그래서, 당신은 헤더 정보를 변경해야합니다 알고. 그래서 여기 그냥 파일에 변경 될 예정되는 실제 요소의 목록입니다. 파일 크기는 이미지뿐만 아니라 폭과 높이를 변경 할 예정이다. 그럼, 비트 맵의​​지도로 돌아 간다 이 파일 헤더 또는 정보를 포함하는 정보 헤더의 여부를 살펴 그리고 필요에 따라 변경합니다. 다시 말하지만, CP copy.c resize.c 말. 그래서 resize.c 지금 사본 안에 포함 전부를 포함 것을 의미합니다 사본은 우리에게 픽셀 각 scanline 픽셀에 읽을 수있는 방법을 제공하기 때문에. 지금 제외하고, 대신에 우리가 추리 소설에했던 것처럼 값을 변경, 우리가 원하는 것은 우리가 여러 픽셀로 작성 싶은 오래 우리의 n은 1보다 큰이기 때문입니다. 그런 다음 우리가 원하는 것은 우리가 N으로 수평을 치고 싶은 뿐만 아니라 N에 수직을 움직. 우리가 어떻게이 작업을 수행 할 수? 귀하의 n은 2 말과이 주어진 infile 있습니다. 커서는 첫 번째에서 시작 것입니다 n은 2면 당신이하길 원하는 것은, 당신은 사람들의 2 인쇄 할. 그럼 당신은 사람들의 2 인쇄 할 수 있습니다. 그런 다음 커서, 빨간 하나 인 다음 픽셀로 이동 것입니다 그리고이 전에 한 일에 그것을를 추가, 그 붉은 색의 2를 인쇄 할거야. 그런 다음 커서는 다음 픽셀로 이동 있으며 그 중 2 유도합니다. 여기서이가 무엇을 copy.c 프레임 워크로 돌아 보면 이 RGB 트리플, 트리플라는 새로운 변수의 새 인스턴스를 생성합니다. 그리고 그건으로 읽고 여기 때, 그것은 infile 한 RGBTRIPLE에서 읽 그 트리플 변수의 내부를 저장합니다. 그래서 당신은 실제로 특정 픽셀을 나타내는 변수가 있습니다. 그럼 당신은 당신이 할 수도 있습니다 무엇을 쓸 때 루프에 fwrite 문을 싸는 is 그 필요에 따라 몇 번으로 outfile에 기록합니다. 그 정도면 간단합니다. 그냥 기본적으로 쓰기 작업 N 수평 확장 할 횟수를 반복합니다. 하지만 우리는 우리의 패딩이 변경되는 것을 기억해야합니다. 이전, 우리는 길이 3 걸 가지고 말한다. 그럼 우리가 얼마나 많은 패딩에 추가까요? 하나 더 4의 여러 확인합니다. 그러나 우리는 N = 2에 의해 특정 이미지를 축소하고 있다고 가정 해 보겠습니다. 그래서 얼마나 많은 블루 픽셀 우리는 마지막 겠어? 우리는 6을 얻을 수 있습니다. 1, 2, 3, 4, 5, 6. 괜찮아요. 6은 4의 배수가 아닙니다. 4 가장 가까운 여러 무엇입니까? 그 8 할거야​​. 그래서 우리는 실제로이 패딩의 2 문자를 할 겁니다. 우리가 패딩을 계산하는 공식이있는 경우 누구나 기억 하는가 , 어디으로? [안 들리게 학생 응답] >> 네, copy.c. 맞아. 당신은 얼마나 패딩 계산 copy.c의 수식이 있습니다 비트 맵 이미지의 특정 폭을 제공. 당신은 패딩의 일정 금액에 추가해야 할 때 그래서 무슨 일이 유용 할 수 실제로 당신이 추가 할 필요가 얼마나 많은 패딩 파악합니다. 그러나 참고하지만, 당신이 적당한 크기를 사용하고 있는지 확인하려는 것입니다. 당신은 기본적으로 두 비트 맵 이미지를 처리​​ 할 것 때문에 조심. 당신이 바로 하나를 사용하고 있는지 확인하고 싶습니다. 당신은 outfile에 대한 여백을 계산할 때, 당신은 outfile의 폭을 사용하려면 아니라 이전의 너비. 좋아요. 는 그런 수평으로 전체 비트 맵 이미지를 스트레칭을 담당한다. 우리가 할 일은 원하는 실제로 수직으로 잘 펴고있다. 이것은 우리가 행을 복사 완료되면 때문에 조금 까다 될 것입니다 그 행을 쓰기, 우리 커서는 마지막에 될 것입니다. 다시 읽고 자한다면 다음 그냥 다음 줄에 읽을거야. 그래서 우리가 원하는 것은 다시 그 행을 복사하는 몇 가지 방법을 찾을 kind입니다 또는 행을 복용 한 후 다시를 바꿀 뿐이예요. 내가 친절 중 - 언급으로이 작업을 수행하는 여러 가지 방법이 있습니다. 당신이 어떻게하고 특정 scanline을 읽고로서 당신이 할 수있는 것은 필요한대로 변경 한 다음 저장소의 종류 배열에서 해당 픽셀의 모든. 나중에 당신에게 당신이 다시 배열을 인쇄해야합니다 알고, 그래서 당신은 그렇게 해당 배열을 사용할 수 있습니다. 할 수있는 또 다른 방법은, 당신이 하나의 행을 복사 수있는 전부입니다 당신은 다시 복사 할 필요가 있다고 이해, 그래서 사실은, 커서를 이동 그리고 그 방법 fseek를 사용 거에요. 다시 커서 모든 방법을 이동 한 다음 다시 복사 과정을 반복 수 있습니다. 우리 스케일링 번호가 N 인 경우 그럼, 몇 번이나 돌아 가야 할 것입니다 그리고 라인을 재 작성? >> [학생] N - 1. >> 네, 좋아요. N - 1. 우리는 한 번 이미 그렇게 한 다음에 우리가 돌​​아갈 과정을 반복 할 것 N - 시간의 1 금액입니다. 좋아요. 그래서 당신은 크기 조정 기능을 갖추고 있습니다. 이제 우리는 정말 재미 부분 복구 나만의 즐겨 찾기 pset에받을 수 있습니다. 대신 비트 맵으로,이 시간 우리는 JPEG 파일로 다루고 있습니다. 우리는 실제로 JPEG 파일의 파일을 제공하지하면, 우리는 기본적으로 원시 메모리 카드 형식을 제공하고 있습니다. 그리고 이건 시작에 정보와 쓰레기 값의 비트가 포함되어 있습니다 다음은 시작하며 JPEG 파일의 무리가 있습니다. 우리가 사진을 삭제 한 곳 그러나, 우리는 카드를 건네하고, 사진이 카드 내에 위치 본질적으로, 우리는 잊어 버렸습니다. 그래서 복구 우리의 작업은이 카드 형식을 통해 이동하는 것입니다 다시 그 사진을 찾으십시오. 다행히도, JPEG 파일 및 카드 파일의 구조는 조금 도움이됩니다. 이렇게 특정 형식으로하지 않는다면 그것은 확실히 약간 난이도가되었습니다 수 있습니다. 모든 JPEG 파일은 실제로 위에서 열거 한 두 가지 시퀀스로 시작. 기본적으로, 새 JPEG 파일을있을 때마다 이 순서 ffd8 ffe0 또는 다른 하나 ffd8 ffe1 중 하나와 함께 시작합니다. 알아야 할 또 다른 유용한 점은 JPEG 파일이 contiguously 저장됩니다 것입니다. 어느 JPEG 파일을 종료 할 때마다, 다른 하나가 시작됩니다. 그래서 값에 중간 모든 종류의가 없습니다. 이미 JPEG를 읽어 봤는데 경우 일단, JPEG의 시작을 누르 당신이 이전과 다음의 시작의 끝을 턴 알아요. 이 시각화의 종류에, 내가 설계도했다. JPEG 파일에 대한 또 다른 한가지는, 우리가 한 번에 512 바이트의 시퀀스에서 내용을 읽을 수 있다는 것입니다 마찬가지로 카드의 시작과. 우리는 형편 때문에 모든 단일 바이트를 확인 할 필요가 없습니다. 대신에, 우리가 할 수있는 것은 실제로 한 번에 512 바이트에서 읽을 수 있습니다 다음, 대신 그 작은 조각에서 그 사이에 검사의, 우리는 512 바이트의 시작을 확인할 수 있습니다. 기본적으로,이 그림에, 어떻게 당신이 보는 것은 카드의 시작 부분에 당신은 실제 JPEG 파일 자체에 아주 관련이없는 값을 가진다. 하지만 내가 가진 것은 JPEG에 대한 두 시작 시퀀스 중 하나를 표시하는 별이다. 그럼 당신은 별을 볼 때마다, 당신은 JPEG 파일을 가지고 있다는 것을 알고. 그리고 모든 JPEG 파일은 512 바이트의 일부 여러 될 것입니다 하지만 같은 여러 필요는 없습니다. 당신이 다른 별을 친다면 당신은 다른 JPEG를 누르 걸 알고하는 방법입니다 바이트의 또 다른 시작 순서. 그런 다음 당신이 여기있는 당신이 스타를 누르까지, 계속 빨간색 JPEG 파일이 있습니다 어떤은 새로운 색상으로 표시됩니다. 계속 한 다음 다른 스타를 누르, 당신은 다른 JPEG를 누르 당신이 끝날 때까지 모든 방법을 계속합니다. 당신이 여기 마지막 사진에있는 분홍색 사람이야. 이 파일 문자의 끝을 누르 때까지 끝으로 이동합니다. 이건 정말 유용 할 것입니다. 여기에 몇 가지 주요 테이크 아웃 : 카드 파일은 JPEG로 시작하지 않습니다 JPEG이 시작되면 그러나, JPEG 파일의 모든 측면에 의해 서로 편을 저장됩니다. 복구에 대한 일부 의사. 첫째, 우리는 우리 카드 파일을 열거야 그게 우리 파일 I / O 함수를 사용하여 할거야. 우리는 파일의 끝에 도달 할 때까지 다음과 같은 과정을 반복거야. 우리는 한 번에 512 바이트를 읽을거야. 그리고 내가 여기서 말은, 우리가 버퍼에 저장하는 것입니다 우리가 그들과 어떻게 정확히 알 때까지 기본적으로 이러한 512 바이트를 가져. 그런 다음 우리가 원하는 것은 우리가 스타 여부를 누르 여부를 확인해야합니다. 우리가 시작 시퀀스 중 하나를 누르 경우 우리가 스타를 누르 한 경우 그리고 우리는 새로운 JPEG 파일을 턴 알아요. 그게 우리가 원하는 것 우리는 우리 pset4 디렉토리에 새 파일을 만들 거예요 그 파일을 계속합니다. 뿐만 아니라, 우리는 이미 전에 JPEG 한 경우 그러면 우리는, 그 파일을 종료하고 pset4 폴더에 보내려 우리가 파일을 저장해야합니다 장소는 우리가 JPEG 파일을 종료 한 지정하지 않은 경우 때문에, 그런 다음에 우리가 기본적으로 보류 금액을해야합니다. JPEG 파일의 끝하지 않습니다. 그래서 우리는, 그렇게 우리가 JPEG 파일에 읽기 및 쓰기 할 때 있는지 확인하려면 우리는 구체적으로 다음 하나를 열려면 해당을 닫습니다 싶습니다. 우리는 몇 가지를 확인하는 것이 좋습니다. 우리는 우리가 버퍼로 새 JPEG의 시작에와 있는지 확인하려면 또한 우리는 이미 전에 JPEG를 발견 한 경우 그 때문에 약간 당신의 프로세스가 변경됩니다. 당신은 모든 방법으로 이동 한 후에 그래서 당신이 파일의 끝을 누르 그런 다음 당신이해야 할 것하면 현재 열려있는 모든 파일을 닫아야 할 것입니다. 그건 아마, 당신이 가지고있는 마지막 JPEG 파일이어야합니다 뿐만 아니라 카드 파일과 당신이 상대 한. 우리가 해결해야 할 마지막 장애물은 실제로 JPEG 파일을 만드는 방법입니다 실제로 폴더에 밀어하는 방법. pset, 당신이 발견 한 모든 JPEG는 다음과 같은 형식이어야합니다 어디서 수 있습니다. JPG. 수는, 그건 0하더라도 우리는 000.jpg 전화하십시오. 당신은 당신의 프로그램에 JPEG를 찾을 때마다 당신은이 발견하고 순서에 이름을 지정하려는거야. 이것은 무엇을 의미할까요? 우리는 우리가 발견 한 몇를 추적 가지 필요 각 JPEG의 수는 있어야하는. 여기 우리는 sprintf 함수를 이용거야. , printf와 마찬가지로 어느 터미널에 지문이 단지 종류의 값 중에 sprintf 폴더로 파일을 출력합니다. 그리고이 거기 문자열 다음에 뭐 제가 sprintf, 제목이 있다면 어떻게, 그리고 것입니다 이 2.jpg를 인쇄합니다. , 내가 제대로 내 파일을 종료 한 가정 그건 내가 알아 쓰는했던 한 파일을 포함합니다. 그러나 한 가지입니다 제가 여기 가지고있는 코드 꽤 pset에 필요한 것을 만족하지 않습니다. pset 두 번째 JPEG 파일 대신 2 002 이름되어야합니다. 그래서 이름을 인쇄 할 때 그럼 당신은 약간 자리 표시 자를 변경 할 수 있습니다. 사람이 우리가 뭔가를 인쇄 할 때 불필요한 공백을 허용하는 방법 기억 하는가? 그래. >> [학생] 당신은 백분율 기호와 2 사이에 3 넣어. >> 네, 좋아요. 우리가 3 공간을 원하기 때문에이 경우 3을 올려 놓을 게요. %의 차원은 아마 당신에게 002.jpg 대신 2를 제공하게됩니다. sprintf 함수에 첫 번째 인수는, 실제로 문자 배열입니다 있는 우리는 이전에 문자열로 알고 있었다. 이러한 의지, 임시 저장처럼 종류, 그냥 결과 문자열을 저장합니다. 당신은 정말이 처리되지 않습니다하지만, 당신이 그걸를 포함해야합니다. 모든 파일 이름 세 글자를 차지 번호를 가지고 알고, 다음. JPG,이 배열은 얼마나 오래해야하나요? 번호를 던져. 이름으로 제목에 몇 글자? 따라서 세 해시 태그, 기간, JPG가 있습니다. >> [학생] 7. >> 7. 전혀 아닙니다. 우리는뿐만 아니라 null이 종결을 할 수 있도록 원하기 때문에 우리는 8 할거야​​. 마지막으로, 단지, 당신은 복구를 위해 일을 할 거라고 과정을 그리는 당신은 몇 가지 시작 정보가 있습니다. 당신은 JPEG 파일의 시작을 찾을 때까지 계속 그 두 시작 시퀀스 중 하나가 될 수 있습니다. 당신은 책을 읽고 계속. 여기에 모든 슬래시는 512 바이트를 나타냅니다. 당신은 다른 시작 순서가 발생할 때까지 읽기 계속 읽기 계속. 일단, 현재 JPEG을 종료하는이 -이 경우, 그것은 빨간색 하나, 그럼 당신은을 종료하고 싶습니다. 당신은 당신의 pset4 폴더에 그 sprintf 이름으로 원하는 다음은 새로운 JPEG를 연 다음 독서을 계속하고 싶어 당신은 다음에 발생할 때까지. 읽기 계속 읽기 계속 그리고 마지막으로, 결국, 당신은 파일의 끝에 도달 할거야 그리고 당신은 당신이 작업하는 동안 가장 마지막에 JPEG를 닫 할 것 sprintf 당신의 pset4 폴더에 다음이라도 한 사진을 모두 볼 것. 그 사진은 실제로 CS50 직원의 사진입니다 pset의 보너스 재미있는 부분이 만들었다는 등이 있습니다 당신이 사진에서 TFS를 찾기 위해 섹션에 경쟁하는 것입니다 그들과 사진을 찍어은 pset를 한 것을 증명하는 그리고 그래서 당신은 직원이 사진에 확인할 수 있습니다. 그럼 당신은 직원과 사진을 찍고있어. 때때로 당신이 그들을 심판해야합니다. 아마도 그들 중 일부는 당신에게서 도망 할 것입니다. 당신은 그들과 함께 사진을 찍고있어. 이 진행 중입니다. pset이 때문입니다 때 인해 아닙니다. 마감 사양에 발표 될 예정입니다. 그런 다음 함께 섹션, 이때 둘 중 빠른 날짜 부분이 가장 사진을 찍을 수 가장 임직원과 상당히 멋진 상을 받게됩니다. 얻을 수 인센티브의 일종 이죠 귀하의 pset4는 가능한 빨리 완료 다음 사업 이야기를 시작하자 수 있기 때문에 모든 다른 CS50 직원 사냥. 필수 아니 잖아,하지만 일단 당신이 사진을 얻을 다음은 pset4이 완료됩니다. 그리고 난 너무 주셔서 감사 연습 4 먹었어요. 과학 수사대와 행운을 빕니다. [박수] [CS50.TV]