1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Walkthrough - Vấn đề Set 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Đại học Harvard] 3 00:00:05,000 --> 00:00:07,340 [Đây là CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 Được rồi. Xin chào, tất cả mọi người, và được chào đón để Walkthrough 4. 5 00:00:11,670 --> 00:00:14,270 >> Hôm nay pset của chúng tôi là Forensics. 6 00:00:14,270 --> 00:00:18,080 Forensics là một pset thực sự thú vị liên quan đến việc đối phó với các tập tin bitmap 7 00:00:18,080 --> 00:00:21,550 để khám phá những người phạm tội. 8 00:00:21,550 --> 00:00:24,200 Sau đó, chúng tôi đang đi để thay đổi kích thước một số tập tin bitmap, 9 00:00:24,200 --> 00:00:27,780 sau đó chúng tôi cũng sẽ đối phó với một phần thực sự thú vị được gọi là phục hồi, 10 00:00:27,780 --> 00:00:31,160 trong đó về cơ bản chúng tôi đang bàn giao một thẻ nhớ 11 00:00:31,160 --> 00:00:34,350 trong đó có người đã vô tình xóa tất cả các tập tin của họ, 12 00:00:34,350 --> 00:00:38,860 và chúng tôi đang yêu cầu để phục hồi các tập tin. 13 00:00:38,860 --> 00:00:42,910 >> Nhưng trước tiên, trước khi chúng tôi nhận được vào các pset, tôi thực sự chỉ muốn chúc mừng tất cả mọi người. 14 00:00:42,910 --> 00:00:45,230 Chúng tôi đang về tại điểm giữa của khóa học này. 15 00:00:45,230 --> 00:00:50,070 Đố 0 là phía sau chúng tôi, và chúng tôi tại pset4, do đó, về cơ bản, chúng tôi đang nửa chừng. 16 00:00:50,070 --> 00:00:55,490 Chúng ta đã đi một chặng đường dài nếu bạn nhìn lại để psets của bạn, pset0 và pset1, 17 00:00:55,490 --> 00:00:57,300 để chúc mừng cho mình về điều đó, 18 00:00:57,300 --> 00:01:00,760 và chúng tôi đang đi để có được vào một số công cụ thực sự thú vị. 19 00:01:00,760 --> 00:01:07,070 >> Vì vậy, hộp công cụ của chúng tôi cho pset này, một lần nữa, thay vì chạy sudo yum-y cập nhật, 20 00:01:07,070 --> 00:01:13,890 chúng tôi có thể chỉ cần chạy update50 nếu bạn đang ở phiên bản 17,3 và ở trên của thiết bị. 21 00:01:13,890 --> 00:01:17,380 Vì vậy, hãy chắc chắn để chạy update50 - đó là dễ dàng hơn rất nhiều, ít hơn một vài ký tự - 22 00:01:17,380 --> 00:01:20,640 để đảm bảo rằng bạn đang ở phiên bản mới nhất của thiết bị. 23 00:01:20,640 --> 00:01:25,410 Đặc biệt quan trọng để update50 khi chúng tôi bắt đầu sử dụng CS50 tra. 24 00:01:25,410 --> 00:01:28,700 Vì vậy, hãy chắc chắn rằng bạn làm điều đó. 25 00:01:28,700 --> 00:01:30,760 >> Đối với tất cả các phần pset này, 26 00:01:30,760 --> 00:01:34,350 chúng ta sẽ được giao dịch với đầu vào và đầu ra tập tin, tập tin I / O. 27 00:01:34,350 --> 00:01:38,140 Chúng tôi sẽ được đi qua rất nhiều các chương trình đối phó với mảng 28 00:01:38,140 --> 00:01:40,350 trỏ đến các tập tin và vật như thế, 29 00:01:40,350 --> 00:01:43,050 vì vậy chúng tôi muốn chắc chắn rằng chúng tôi thực sự quen thuộc và thoải mái 30 00:01:43,050 --> 00:01:47,990 giao dịch với đầu vào và đầu ra vào các tập tin. 31 00:01:47,990 --> 00:01:52,080 >> Trong đoạn code phân phối cho pset này là một tập tin gọi là% s, 32 00:01:52,080 --> 00:01:55,280 và đó là những gì chúng tôi đang đi tìm là có được thực sự hữu ích cho chúng tôi 33 00:01:55,280 --> 00:02:00,340 bởi vì chúng tôi sẽ kết thúc thực sự sao chép các tập tin copy.c 34 00:02:00,340 --> 00:02:05,350 và chỉ cần thay đổi nó một chút để có thể để đạt được 2 phần đầu tiên của bộ vấn đề. 35 00:02:05,350 --> 00:02:09,030 >> Và như vậy thì như tôi đã đề cập trước đây, chúng ta đang đối phó với bitmap cũng như hình ảnh JPEG. 36 00:02:09,030 --> 00:02:13,170 Vì vậy, thực sự hiểu cấu trúc của các tập tin được tổ chức như thế nào, 37 00:02:13,170 --> 00:02:16,170 làm thế nào chúng ta thực sự có thể dịch 0 và 1 vào cấu trúc 38 00:02:16,170 --> 00:02:19,040 và những điều chúng ta thực sự có thể hiểu và giải thích và chỉnh sửa, 39 00:02:19,040 --> 00:02:21,000 sẽ được thực sự quan trọng, 40 00:02:21,000 --> 00:02:25,970 do đó, đi sâu vào JPEG và các tập tin bitmap và hiểu rõ cấu trúc của những người. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, như thường lệ, bắt đầu với một phần của câu hỏi. 42 00:02:30,780 --> 00:02:36,600 Những người sẽ đối phó với các tập tin I / O và giúp bạn quen với điều đó. 43 00:02:36,600 --> 00:02:42,520 Sau đó, phần 1 là Whodunit, trong đó bạn đang đưa ra một tập tin bitmap 44 00:02:42,520 --> 00:02:45,630 trông giống như dấu chấm màu đỏ trên tất cả. 45 00:02:45,630 --> 00:02:52,180 Và sau đó về cơ bản những gì chúng ta sẽ làm là tập tin này và chỉ cần chỉnh sửa nó một chút 46 00:02:52,180 --> 00:02:54,010 vào một phiên bản mà chúng ta có thể đọc. 47 00:02:54,010 --> 00:02:56,000 Về cơ bản, một khi chúng ta kết thúc, chúng ta sẽ có cùng một tập tin, 48 00:02:56,000 --> 00:03:02,630 ngoại trừ chúng ta sẽ có thể để xem tin nhắn ẩn ẩn bởi tất cả những dấu chấm màu đỏ. 49 00:03:02,630 --> 00:03:07,310 Sau đó, Resize là một chương trình đó, đưa ra một tập tin 50 00:03:07,310 --> 00:03:11,490 và sau đó đưa ra tên của các tập tin mà nó ra và sau đó đưa ra một số, 51 00:03:11,490 --> 00:03:16,850 sẽ thực sự thay đổi kích thước mà bitmap đó giá trị số nguyên. 52 00:03:16,850 --> 00:03:19,240 Sau đó, cuối cùng, chúng tôi có pset Recover. 53 00:03:19,240 --> 00:03:24,160 Chúng tôi được cho một thẻ nhớ và sau đó có để phục hồi tất cả các hình ảnh 54 00:03:24,160 --> 00:03:25,920 đã bị vô tình xóa, 55 00:03:25,920 --> 00:03:31,420 nhưng, như chúng ta sẽ tìm hiểu, không thực sự bị xóa và loại bỏ từ tập tin; 56 00:03:31,420 --> 00:03:38,470 chúng ta chỉ cần loại bị mất nơi họ đã ở trong tập tin, nhưng chúng tôi sẽ phục hồi đó. 57 00:03:38,470 --> 00:03:44,950 >> Lớn. Vì vậy, đi sâu vào tập tin I / O đặc biệt, đây là một danh sách toàn bộ các chức năng mà bạn sẽ sử dụng. 58 00:03:44,950 --> 00:03:49,840 Bạn đã nhìn thấy một chút những điều cơ bản của fopen, fread và fwrite, 59 00:03:49,840 --> 00:03:54,350 nhưng chúng ta sẽ nhìn sâu hơn vào một số tập tin I / chức năng O như fputc, 60 00:03:54,350 --> 00:03:56,930 trong đó bạn chỉ cần viết một ký tự tại một thời điểm, 61 00:03:56,930 --> 00:04:02,000 fseek, nơi bạn loại di chuyển các tập tin chỉ báo vị trí tới lui, 62 00:04:02,000 --> 00:04:05,770 và sau đó một số người khác. Nhưng chúng tôi sẽ đi vào đó một chút sau đó trong các pset. 63 00:04:08,050 --> 00:04:13,100 >> Vì vậy, đầu tiên, chỉ để có được vào một tập tin I / O trước khi chúng ta đi vào các pset, 64 00:04:13,100 --> 00:04:19,860 để mở một tập tin, ví dụ, những gì bạn phải làm là thực sự thiết lập một con trỏ đến tập tin đó. 65 00:04:19,860 --> 00:04:22,710 Vì vậy, chúng tôi có một con trỏ * FILE. 66 00:04:22,710 --> 00:04:27,140 Trong trường hợp này, tôi gọi nó là một trong con trỏ bởi vì đó sẽ là infile của tôi. 67 00:04:27,140 --> 00:04:33,340 Và vì vậy tôi sẽ sử dụng fopen chức năng và sau đó là tên của tập tin 68 00:04:33,340 --> 00:04:36,360 và sau đó là chế độ mà tôi sẽ được giao dịch với tập tin. 69 00:04:36,360 --> 00:04:42,080 Vì vậy, có "r" trong trường hợp này để đọc, "w" để ghi, và sau đó "a" cho phụ thêm. 70 00:04:42,080 --> 00:04:44,270 Ví dụ, khi bạn đang làm việc với một infile 71 00:04:44,270 --> 00:04:47,310 và tất cả những gì bạn muốn làm là đọc các bit và byte lưu trữ ở đó, 72 00:04:47,310 --> 00:04:50,420 sau đó bạn có thể sẽ muốn sử dụng "r" như chế độ của bạn. 73 00:04:50,420 --> 00:04:54,520 Khi bạn muốn thực sự viết, loại làm cho một tập tin mới, 74 00:04:54,520 --> 00:04:57,220 sau đó những gì chúng ta sẽ làm là chúng ta sẽ mở các tập tin mới 75 00:04:57,220 --> 00:05:02,410 và sử dụng chế độ "w" để viết. 76 00:05:02,410 --> 00:05:07,540 >> Vì vậy, sau đó khi bạn đang thực sự đọc vào các tập tin, cấu trúc như sau. 77 00:05:07,540 --> 00:05:14,930 Trước tiên, bạn bao gồm con trỏ đến struct sẽ chứa các byte mà bạn đang đọc. 78 00:05:14,930 --> 00:05:19,830 Vì vậy, đó sẽ là vị trí cuối cùng của các byte mà bạn đang đọc. 79 00:05:19,830 --> 00:05:23,360 Sau đó bạn sẽ cho biết kích thước, như về cơ bản có bao nhiêu byte 80 00:05:23,360 --> 00:05:30,100 chương trình của bạn đọc trong tập tin, kích thước cơ bản một trong những yếu tố, 81 00:05:30,100 --> 00:05:32,620 và sau đó bạn sẽ xác định có bao nhiêu yếu tố bạn muốn đọc. 82 00:05:32,620 --> 00:05:34,980 Và cuối cùng, bạn phải biết nơi bạn đang đọc, 83 00:05:34,980 --> 00:05:37,580 do đó sẽ là con trỏ trong của bạn. 84 00:05:37,580 --> 00:05:41,780 Tôi mã hóa bằng màu này vì fread cũng rất tương tự như fwrite, 85 00:05:41,780 --> 00:05:47,050 ngoại trừ bạn muốn làm cho chắc chắn rằng bạn sử dụng đúng thứ tự, 86 00:05:47,050 --> 00:05:51,960 hãy chắc chắn rằng bạn đang thực sự bằng văn bản hoặc đọc từ tập tin bên phải. 87 00:05:54,910 --> 00:05:58,610 >> Vì vậy, sau đó như trước đây, nếu chúng ta có kích thước của phần tử cũng như số lượng của các yếu tố, 88 00:05:58,610 --> 00:06:00,600 sau đó chúng ta có thể chơi xung quanh một chút. 89 00:06:00,600 --> 00:06:06,810 Nói rằng tôi có một cấu trúc DOG và do đó, sau đó tôi muốn đọc hai con chó tại một thời điểm. 90 00:06:06,810 --> 00:06:12,450 Những gì tôi có thể làm là nói kích thước của một trong những yếu tố là có được kích thước của một DOG 91 00:06:12,450 --> 00:06:14,770 và tôi sẽ thực sự đọc hai người trong số họ. 92 00:06:14,770 --> 00:06:18,290 Ngoài ra, những gì tôi có thể làm là nói tôi chỉ cần đi để đọc một trong những yếu tố 93 00:06:18,290 --> 00:06:21,340 và là một trong những yếu tố là có được kích thước của hai con chó. 94 00:06:21,340 --> 00:06:24,320 Vì vậy, đó là tương tự như làm thế nào bạn có thể chơi xung quanh với kích thước và số 95 00:06:24,320 --> 00:06:28,250 tùy thuộc vào những gì trực quan hơn cho bạn. 96 00:06:28,250 --> 00:06:30,810 >> Được rồi. Vì vậy, bây giờ chúng tôi nhận được các tập tin văn bản. 97 00:06:30,810 --> 00:06:36,880 Khi bạn muốn viết một tập tin, tham số đầu tiên thực sự là nơi mà bạn đang đọc từ. 98 00:06:36,880 --> 00:06:42,050 Vì vậy, đó là về cơ bản các dữ liệu mà bạn đang đi để viết vào tập tin, 99 00:06:42,050 --> 00:06:44,490 là con trỏ ra ở cuối. 100 00:06:44,490 --> 00:06:47,670 Vì vậy, khi bạn đang làm việc với pset, hãy chắc chắn rằng bạn không bị lẫn lộn. 101 00:06:47,670 --> 00:06:50,480 Có thể có định nghĩa bên cạnh. 102 00:06:50,480 --> 00:06:58,090 Bạn có thể kéo các định nghĩa trong hướng dẫn sử dụng bằng cách gõ người đàn ông và sau đó fwrite, ví dụ, 103 00:06:58,090 --> 00:06:59,950 thiết bị đầu cuối, hoặc bạn có thể tham khảo trở lại slide này 104 00:06:59,950 --> 00:07:03,570 và chắc chắn rằng bạn đang sử dụng một trong những quyền. 105 00:07:03,570 --> 00:07:08,700 Vì vậy, một lần nữa, fwrite, khi bạn có một tập tin mà bạn muốn để viết vào, 106 00:07:08,700 --> 00:07:14,290 đó là sẽ là đối số cuối cùng và đó sẽ là một con trỏ đến tập tin đó. 107 00:07:14,290 --> 00:07:18,670 Vì vậy, sau đó là làm thế nào chúng ta đối phó với văn bản có lẽ byte lại với nhau tại một thời điểm, 108 00:07:18,670 --> 00:07:21,820 nhưng nói rằng bạn muốn chỉ cần viết chỉ trong một nhân vật duy nhất. 109 00:07:21,820 --> 00:07:25,940 Như chúng ta sẽ thấy sau này trong ví dụ này, các bitmap chúng tôi sẽ có để sử dụng. 110 00:07:25,940 --> 00:07:32,180 Đó là khi chúng ta có thể sử dụng fputc, về cơ bản chỉ cần đặt một ký tự tại một thời điểm, chr, 111 00:07:32,180 --> 00:07:37,050 vào con trỏ tập tin, và con trỏ của chúng tôi ra khỏi đó. 112 00:07:38,700 --> 00:07:41,560 Vì vậy, sau đó bất cứ khi nào chúng ta tìm kiếm hoặc viết trong một tập tin, 113 00:07:41,560 --> 00:07:44,690 các tập tin được theo dõi của chúng tôi đang ở đâu. 114 00:07:44,690 --> 00:07:47,810 Vì vậy, nó là một loại của con trỏ, chỉ số vị trí tập tin. 115 00:07:47,810 --> 00:07:54,330 Và như vậy bất cứ khi nào chúng tôi viết hoặc đọc một lần nữa vào một tập tin, 116 00:07:54,330 --> 00:07:56,760 tập tin thực sự nhớ nó ở đâu, 117 00:07:56,760 --> 00:07:59,270 và do đó, nó tiếp tục từ nơi con trỏ. 118 00:07:59,270 --> 00:08:03,970 Điều này có thể có lợi khi bạn muốn, nói, đọc trong một số tiền nhất định để làm một cái gì đó 119 00:08:03,970 --> 00:08:06,160 và sau đó đọc trong số tiền sau đây, 120 00:08:06,160 --> 00:08:10,700 nhưng đôi khi chúng ta có thể muốn đi lại hoặc thực sự bắt đầu từ một giá trị tham khảo nhất định. 121 00:08:10,700 --> 00:08:16,870 Vì vậy, sau đó chức năng fseek, những gì nó làm là cho phép chúng ta di chuyển con trỏ trong một tập tin nhất định 122 00:08:16,870 --> 00:08:19,680 một số lượng nhất định các byte. 123 00:08:19,680 --> 00:08:24,260 Và sau đó những gì chúng ta phải làm là xác định nơi mà các giá trị tham khảo. 124 00:08:24,260 --> 00:08:31,520 Vì vậy, hoặc nó di chuyển về phía trước hoặc phía sau, từ nơi con trỏ chuột hiện tại, 125 00:08:31,520 --> 00:08:35,750 hoặc chúng ta có thể xác định rằng nó chỉ nên di chuyển từ đầu của tập tin 126 00:08:35,750 --> 00:08:37,090 hoặc từ ngày kết thúc của tập tin. 127 00:08:37,090 --> 00:08:41,230 Và như vậy bạn có thể vượt qua trong các giá trị tiêu cực hay tích cực đến số tiền, 128 00:08:41,230 --> 00:08:44,960 và rằng loại sẽ di chuyển con trỏ hoặc chuyển tiếp hoặc lùi. 129 00:08:46,170 --> 00:08:51,920 >> Trước khi chúng tôi nhận được vào psets khác, bất kỳ câu hỏi về tập tin I / O? 130 00:08:53,860 --> 00:08:59,990 Okay. Khi chúng tôi nhận được vào các ví dụ nhiều hơn, cảm thấy tự do để ngăn chặn tôi cho các câu hỏi. 131 00:08:59,990 --> 00:09:06,930 >> Vì vậy, trong Whodunit, bạn đang trao cho một tập tin bitmap tương tự như một màu đỏ này trên slide, 132 00:09:06,930 --> 00:09:14,510 và nó trông như thế này - một loạt các dấu chấm màu đỏ - và bạn không thực sự biết những gì được viết. 133 00:09:14,510 --> 00:09:23,310 Nếu bạn nheo mắt, bạn có thể nhìn thấy một màu sắc nhẹ hơi xanh bên trong giữa. 134 00:09:23,310 --> 00:09:26,270 Về cơ bản, đó là nơi mà văn bản được lưu trữ. 135 00:09:26,270 --> 00:09:30,270 Có một vụ giết người đã xảy ra, và chúng tôi cần phải tìm ra người đã làm nó. 136 00:09:30,270 --> 00:09:36,760 Để làm điều đó, chúng ta cần phải loại chuyển đổi ảnh sang một định dạng có thể đọc được. 137 00:09:36,760 --> 00:09:42,740 Nếu bạn từng gặp phải điều này, đôi khi sẽ có bộ dụng cụ nhỏ 138 00:09:42,740 --> 00:09:48,510 nơi bạn sẽ có một cái kính lúp với một bộ phim màu đỏ. Bất cứ ai? Yeah. 139 00:09:48,510 --> 00:09:52,770 Vì vậy, bạn sẽ là tay một cái gì đó như thế này, bạn sẽ có một kính lúp 140 00:09:52,770 --> 00:09:58,130 với bộ phim màu đỏ trên nó, bạn sẽ đặt nó lên trên ảnh, 141 00:09:58,130 --> 00:10:03,410 và bạn sẽ có thể để xem tin nhắn ẩn trong đó. 142 00:10:03,410 --> 00:10:07,080 Chúng tôi không có một kính lúp với bộ phim màu đỏ, do đó, thay vì chúng ta sẽ loại tạo của chúng ta 143 00:10:07,080 --> 00:10:09,060 pset này. 144 00:10:09,060 --> 00:10:15,760 Và do đó, người sử dụng sẽ whodunit đầu vào, sau đó các đầu mối, bmp, 145 00:10:15,760 --> 00:10:18,800 vì vậy đó là infile, đó là thông báo chấm đỏ, 146 00:10:18,800 --> 00:10:23,550 và sau đó họ nói verdict.bmp sẽ được outfile của chúng tôi. 147 00:10:23,550 --> 00:10:27,900 Vì vậy, nó sẽ tạo ra một hình ảnh bitmap mới tương tự như một đầu mối 148 00:10:27,900 --> 00:10:32,600 ngoại trừ trong một định dạng có thể đọc được mà chúng ta có thể nhìn thấy thông báo ẩn. 149 00:10:32,600 --> 00:10:37,550 >> Vì chúng ta sẽ được giao dịch với bitmap chỉnh sửa và thao tác của một số loại, 150 00:10:37,550 --> 00:10:42,400 chúng ta sẽ loại lặn vào trong cấu trúc của các tập tin bitmap. 151 00:10:42,400 --> 00:10:48,130 Chúng tôi đã đi qua những bit một chút trong bài giảng, nhưng chúng ta hãy nhìn vào một số chi tiết. 152 00:10:48,130 --> 00:10:51,740 Bitmap cơ bản chỉ là một sắp xếp của các byte 153 00:10:51,740 --> 00:10:55,790 nơi mà chúng tôi đã chỉ định byte có nghĩa là gì. 154 00:10:55,790 --> 00:11:00,540 Vì vậy, đây là loại giống như bản đồ của hình ảnh bitmap 155 00:11:00,540 --> 00:11:08,550 nói rằng nó bắt đầu với một số tập tin tiêu đề, bắt đầu với một số thông tin trong đó. 156 00:11:08,550 --> 00:11:16,540 Bạn thấy rằng số byte khoảng 14 kích cỡ được chỉ định của hình ảnh bitmap, 157 00:11:16,540 --> 00:11:18,520 và nó vẫn tiếp tục. 158 00:11:18,520 --> 00:11:23,810 Nhưng sau đó những gì chúng tôi đang thực sự quan tâm đến ở đây được bắt đầu từ khoảng số byte 54. 159 00:11:23,810 --> 00:11:26,060 Chúng tôi có những ba RGB. 160 00:11:26,060 --> 00:11:30,760 Những gì sẽ làm là có chứa các điểm ảnh thực tế, các giá trị màu. 161 00:11:30,760 --> 00:11:35,950 Tất cả mọi thứ ở trên đó trong tiêu đề là một số thông tin 162 00:11:35,950 --> 00:11:41,240 tương ứng với kích thước của hình ảnh, chiều rộng của hình ảnh, và chiều cao. 163 00:11:41,240 --> 00:11:44,930 Khi chúng tôi đi vào đệm sau này, chúng ta sẽ thấy lý do tại sao kích thước của hình ảnh 164 00:11:44,930 --> 00:11:48,670 có thể khác hơn chiều rộng hoặc chiều cao. 165 00:11:48,670 --> 00:11:54,240 Vì vậy, sau đó để đại diện cho những những hình ảnh bitmap là chuỗi các byte 166 00:11:54,240 --> 00:11:59,370 những gì chúng ta có thể làm là nói được rồi, tôi sẽ phải nhớ rằng tại chỉ số 14, 167 00:11:59,370 --> 00:12:03,380 đó là nơi kích thước là, ví dụ, nhưng thay vì những gì chúng ta sẽ làm gì để thực hiện điều này dễ dàng hơn 168 00:12:03,380 --> 00:12:06,020 được đóng gói nó trong một cấu trúc. 169 00:12:06,020 --> 00:12:08,880 Và vì vậy chúng tôi có hai cấu trúc được thực hiện đối với chúng tôi, một BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 và một BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 và bất cứ khi nào chúng ta đọc trong tập tin đó, theo mặc định nó sẽ được đi theo thứ tự, 172 00:12:14,840 --> 00:12:22,360 và như vậy để nó cũng sẽ điền vào các biến như biWidth và biSize. 173 00:12:25,270 --> 00:12:31,230 Và cuối cùng, mỗi điểm ảnh được đại diện bởi ba byte. 174 00:12:31,230 --> 00:12:35,500 Người đầu tiên là số lượng màu xanh trong các điểm ảnh, thứ hai là số lượng màu xanh lá cây, 175 00:12:35,500 --> 00:12:41,120 và cuối cùng, số lượng của màu đỏ, trong đó 0 là cơ bản không có màu xanh lá cây màu xanh hoặc không có hoặc không có màu đỏ 176 00:12:41,120 --> 00:12:43,720 và sau đó ff là giá trị tối đa. 177 00:12:43,720 --> 00:12:46,800 Đây là những giá trị thập lục phân. 178 00:12:46,800 --> 00:12:53,870 Vì vậy, sau đó nếu chúng ta có ff0000, sau đó tương ứng với số tiền tối đa của màu xanh 179 00:12:53,870 --> 00:12:58,890 và sau đó không có màu xanh lá cây và không có màu đỏ, do đó, sau đó sẽ cung cấp cho chúng tôi một điểm ảnh màu xanh. 180 00:12:58,890 --> 00:13:04,190 Sau đó, nếu chúng ta có tất cả qua hội đồng quản trị của ff, thì đó có nghĩa là chúng tôi có một điểm ảnh màu trắng. 181 00:13:04,190 --> 00:13:11,370 Đây là loại đối diện với thường khi chúng ta nói RGB. Nó thực sự sẽ BGR. 182 00:13:12,750 --> 00:13:18,990 >> Vì vậy, nếu chúng ta thực sự nhìn vào một ví dụ về một hình ảnh bitmap - cho tôi kéo một ở đây. 183 00:13:31,560 --> 00:13:33,830 Đó là một chút nhỏ. 184 00:13:39,890 --> 00:13:47,840 Tôi phóng to, và chúng ta có thể nhìn thấy nó pixelated. Nó trông giống như các khối màu. 185 00:13:47,840 --> 00:13:50,110 Bạn có khối màu trắng và sau đó các khối màu đỏ. 186 00:13:50,110 --> 00:13:53,700 Nếu bạn chơi trong Microsoft Paint, ví dụ, bạn có thể làm một cái gì đó như thế 187 00:13:53,700 --> 00:13:58,960 bởi về cơ bản chỉ cần vẽ hình vuông theo một thứ tự cụ thể nào đó. 188 00:13:58,960 --> 00:14:08,060 Vì vậy, sau đó dịch này trong bitmap là như sau. 189 00:14:08,060 --> 00:14:15,710 Ở đây chúng tôi có điểm ảnh da trắng đầu tiên, tất cả 6 f của, và sau đó chúng tôi có màu đỏ nào, 190 00:14:15,710 --> 00:14:19,910 được chỉ định bởi 0000FF. 191 00:14:19,910 --> 00:14:27,940 Và do đó, thứ tự của các byte chúng ta có chỉ ra cách thức hình ảnh bitmap sẽ xem xét. 192 00:14:27,940 --> 00:14:32,230 Vì vậy, những gì tôi đã thực hiện ở đây là chỉ cần viết ra tất cả những byte và sau đó màu đỏ 193 00:14:32,230 --> 00:14:37,550 để bạn có thể loại thấy, nếu bạn nheo mắt một chút, làm thế nào loại đó cho thấy một khuôn mặt cười. 194 00:14:40,180 --> 00:14:46,390 >> Cách làm việc hình ảnh bitmap là tôi hình dung nó về cơ bản như là một mạng lưới. 195 00:14:46,390 --> 00:14:54,940 Và như vậy, theo mặc định, tất cả các dòng của lưới điện có phải là một bội số của 4 byte. 196 00:15:00,520 --> 00:15:07,060 Nếu chúng ta nhìn vào một hình ảnh bitmap, bạn điền vào giá trị mỗi. 197 00:15:07,060 --> 00:15:17,370 Ví dụ, bạn có thể có một màu đỏ, một màu xanh lá cây ở đây, một màu xanh ở đây, 198 00:15:17,370 --> 00:15:24,950 nhưng bạn phải đảm bảo rằng hình ảnh được làm đầy với một bội số của bốn byte. 199 00:15:24,950 --> 00:15:32,200 Vì vậy, nếu tôi muốn hình ảnh của tôi sẽ được rộng ba khối, sau đó tôi sẽ cần phải đặt một giá trị rỗng 200 00:15:32,200 --> 00:15:35,640 người cuối cùng làm cho nó là bội số của bốn. 201 00:15:35,640 --> 00:15:39,530 Vì vậy, sau đó tôi sẽ thêm vào một cái gì đó mà chúng ta đang gọi điện thoại đệm. 202 00:15:39,530 --> 00:15:43,750 Tôi chỉ sẽ chỉ ra rằng có một x. 203 00:15:44,920 --> 00:15:54,160 Bây giờ nói rằng chúng ta muốn một hình ảnh đó là 7 pixels, ví dụ. 204 00:15:54,160 --> 00:15:59,550 Chúng tôi có 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 và tất cả điều đó được điền vào với màu sắc. 206 00:16:07,000 --> 00:16:10,620 Cách mà hình ảnh bitmap làm việc là chúng ta cần một 8. 207 00:16:10,620 --> 00:16:12,460 Ngay bây giờ, chúng tôi có 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Chúng ta cần 8 không gian cho hình ảnh bitmap để đọc một cách chính xác. 209 00:16:19,360 --> 00:16:25,600 Vì vậy, sau đó những gì chúng ta phải làm là thêm vào một chút của padding 210 00:16:25,600 --> 00:16:29,430 để đảm bảo rằng tất cả các chiều rộng được thống nhất 211 00:16:29,430 --> 00:16:34,260 và rằng tất cả các chiều rộng là một bội số của 4. 212 00:16:42,110 --> 00:16:47,310 Và vì vậy tôi trước đây chỉ ra, đệm là x hoặc nguệch ngoạc dòng, 213 00:16:47,310 --> 00:16:53,880 nhưng trong những hình ảnh bitmap thực tế đệm được chỉ định bởi một 0 thập lục phân. 214 00:16:53,880 --> 00:16:57,340 Vì vậy, đó sẽ là một nhân vật duy nhất, 0. 215 00:16:58,980 --> 00:17:06,329 Những gì có thể có ích là lệnh xxd. 216 00:17:06,329 --> 00:17:11,220 Những gì nó là thực sự cho bạn thấy, như tương tự như những gì tôi đã làm trước đây với các smiley 217 00:17:11,220 --> 00:17:15,630 khi tôi thực sự in ra mỗi màu sắc sẽ được cho điểm ảnh 218 00:17:15,630 --> 00:17:21,800 và sau đó màu mã hoá nó, khi bạn chạy xxd với các lệnh sau đây, 219 00:17:21,800 --> 00:17:28,670 sau đó nó thực sự sẽ in ra những màu sắc cho những điểm ảnh. 220 00:17:28,670 --> 00:17:33,810 Những gì bạn phải làm là ở đây tôi chỉ ra, như s-54 221 00:17:33,810 --> 00:17:36,530 nói rằng tôi sẽ bắt đầu từ byte 54 222 00:17:36,530 --> 00:17:40,820 vì trước đó, hãy nhớ nếu chúng ta nhìn lại bản đồ của các bitmap, 223 00:17:40,820 --> 00:17:42,690 đó là tất cả các thông tin tiêu đề và vật như thế. 224 00:17:42,690 --> 00:17:46,280 Nhưng những gì chúng tôi thực sự quan tâm là các điểm ảnh thực tế cho thấy màu sắc. 225 00:17:46,280 --> 00:17:52,700 Vì vậy, bằng cách thêm vào trong lá cờ đó,-s 54, sau đó chúng tôi có thể nhìn thấy các giá trị màu. 226 00:17:52,700 --> 00:17:56,020 Và đừng lo lắng về những lá cờ và những thứ phức tạp như thế. 227 00:17:56,020 --> 00:18:05,020 Trong spec bộ vấn đề, bạn sẽ có hướng dẫn về cách sử dụng xxd để hiển thị các điểm ảnh. 228 00:18:07,070 --> 00:18:15,590 Vì vậy, nếu bạn nhìn thấy ở đây, nó loại trông giống như một hộp màu xanh lá cây, điều này nhỏ. 229 00:18:15,590 --> 00:18:23,610 Tôi đã mã hóa bằng màu 00FF00 như về cơ bản nói không có màu xanh, rất nhiều màu xanh lá cây, và không có màu đỏ. 230 00:18:23,610 --> 00:18:26,370 Vì vậy, tương ứng với màu xanh lá cây. 231 00:18:26,370 --> 00:18:31,920 Như bạn thấy ở đây, chúng ta thấy một hình chữ nhật màu xanh lá cây. 232 00:18:31,920 --> 00:18:36,660 Hình chữ nhật màu xanh lá cây là chỉ có 3 điểm ảnh, do đó, sau đó những gì chúng ta phải làm 233 00:18:36,660 --> 00:18:44,350 để đảm bảo rằng hình ảnh là một bội số của 4 rộng thêm trong đệm thêm. 234 00:18:44,350 --> 00:18:49,460 Và như vậy thì đó là cách bạn nhìn thấy những số 0 ở đây. 235 00:18:49,460 --> 00:18:54,510 Điều này thực sự sẽ là kết quả của pset Resize của bạn, 236 00:18:54,510 --> 00:19:01,350 về cơ bản các bitmap nhỏ và sau đó mở rộng cho 4. 237 00:19:01,350 --> 00:19:09,380 Và vì vậy những gì chúng ta thấy là hình ảnh này rộng 12 pixels, nhưng 12 là một bội số của 4, 238 00:19:09,380 --> 00:19:12,940 và như vậy chúng tôi thực sự không thấy bất kỳ số 0 ở cuối vì chúng ta không cần thêm bất kỳ 239 00:19:12,940 --> 00:19:19,070 bởi vì nó hoàn toàn độn. Nó không có phòng nữa. 240 00:19:20,720 --> 00:19:23,470 >> Okay. Bất kỳ câu hỏi về đệm? 241 00:19:25,150 --> 00:19:27,460 Okay. Cool. 242 00:19:27,460 --> 00:19:32,520 >> Như tôi đã đề cập trước đây, các bitmap chỉ là một chuỗi các byte. 243 00:19:32,520 --> 00:19:39,170 Và vì vậy những gì chúng ta có là thay vì cần phải theo dõi số chính xác của byte 244 00:19:39,170 --> 00:19:47,050 tương ứng với một yếu tố cụ thể, chúng tôi thực sự đã tạo ra một cấu trúc đại diện cho rằng. 245 00:19:47,050 --> 00:19:50,930 Vì vậy, những gì chúng ta có là một cấu trúc RGBTRIPLE. 246 00:19:50,930 --> 00:19:54,590 Bất cứ khi nào bạn có một thể hiện của một triple RGB, 247 00:19:54,590 --> 00:20:00,970 bởi vì đây là một loại xác định cấu trúc, sau đó bạn có thể truy cập biến rgbtBlue, 248 00:20:00,970 --> 00:20:09,520 tương tự như xanh và đỏ biến, mà sẽ chỉ ra bao nhiêu màu xanh, màu xanh lá cây, và màu đỏ, 249 00:20:09,520 --> 00:20:11,580 tương ứng, bạn có. 250 00:20:11,580 --> 00:20:16,800 >> Vì vậy, nếu chúng ta có đặt biến màu xanh 0, thiết lập màu xanh lá cây ff, 251 00:20:16,800 --> 00:20:22,060 đó là giá trị tối đa bạn có thể có, và sau đó biến màu đỏ thiết lập là 0, 252 00:20:22,060 --> 00:20:27,870 sau đó những gì màu RGB ba đặc biệt này sẽ đại diện cho? >> [Sinh viên] Green. 253 00:20:27,870 --> 00:20:29,150 Green. Chính xác. 254 00:20:29,150 --> 00:20:34,480 Nó sẽ là hữu ích để biết rằng bất cứ khi nào bạn có một thể hiện của một triple RGB, 255 00:20:34,480 --> 00:20:41,340 bạn thực sự có thể truy cập vào số lượng của màu sắc - màu xanh, màu xanh lá cây, và màu đỏ - một cách riêng biệt. 256 00:20:43,350 --> 00:20:54,900 >> Bây giờ chúng ta đã nói chuyện về cấu trúc đó, chúng ta hãy nhìn vào các tập tin BMP. 257 00:20:54,900 --> 00:20:57,870 Đây là những cấu trúc thực hiện cho bạn. 258 00:20:57,870 --> 00:21:01,820 Ở đây chúng tôi có một cấu trúc BITMAPFILEHEADER. 259 00:21:01,820 --> 00:21:07,610 Quan tâm là kích thước. 260 00:21:07,610 --> 00:21:12,660 Sau đó, chúng tôi có tiêu đề thông tin, trong đó có một vài điều mà là thú vị đối với chúng tôi, 261 00:21:12,660 --> 00:21:15,480 cụ thể là các kích thước, chiều rộng và chiều cao. 262 00:21:15,480 --> 00:21:19,170 Như chúng ta sẽ đi vào sau này, khi bạn đọc trong tập tin, 263 00:21:19,170 --> 00:21:25,500 nó sẽ tự động đọc bởi vì chúng tôi đã thiết lập thứ tự để được giống. 264 00:21:25,500 --> 00:21:31,990 Vì vậy, các biSize sẽ chứa các byte bên phải tương ứng với kích thước thực tế của hình ảnh. 265 00:21:34,700 --> 00:21:40,500 Và sau đó ở đây, cuối cùng, như chúng tôi đã nói chuyện về, chúng tôi có RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Chúng tôi có một rgbtBlue, Green, và Red liên kết với nó. 267 00:21:48,210 --> 00:21:49,340 >> Lớn. Okay. 268 00:21:49,340 --> 00:21:56,360 Bây giờ chúng ta hiểu bitmap một chút, hiểu rằng chúng ta có một phần đầu tập tin 269 00:21:56,360 --> 00:22:00,790 và một tiêu đề thông tin liên quan với nó và sau đó sau đó, chúng tôi có những thứ thú vị 270 00:22:00,790 --> 00:22:05,110 màu sắc, và những màu sắc được đại diện bởi cấu trúc RGBTRIPLE, 271 00:22:05,110 --> 00:22:12,710 và những người, lần lượt, có ba giá trị liên quan đến màu xanh, màu xanh lá cây, và màu đỏ. 272 00:22:12,710 --> 00:22:17,270 >> Vì vậy, bây giờ, chúng ta có thể nghĩ về việc phục hồi một chút. 273 00:22:17,270 --> 00:22:20,130 Xin lôi. Hãy suy nghĩ về Whodunit. 274 00:22:20,130 --> 00:22:25,750 Khi chúng tôi có tập tin đầu mối của chúng tôi, sau đó những gì chúng tôi muốn làm là đọc trong điểm ảnh pixel 275 00:22:25,750 --> 00:22:33,860 và sau đó bằng cách nào đó thay đổi những điểm ảnh để chúng tôi có thể sản xuất nó sang một định dạng có thể đọc được. 276 00:22:33,860 --> 00:22:41,020 Và như vậy để sản xuất nó, chúng ta sẽ viết pixel của điểm ảnh vào tập tin verdict.bmp. 277 00:22:41,020 --> 00:22:45,120 Đó là loại rất nhiều để làm. Chúng tôi nhận ra rằng. 278 00:22:45,120 --> 00:22:49,860 Vì vậy, những gì chúng tôi đã làm là chúng ta đã thực sự cung cấp cho bạn copy.c. 279 00:22:49,860 --> 00:22:57,610 % S không chỉ là làm cho một bản sao chính xác của một tập tin bitmap nhất định và sau đó đầu ra nó. 280 00:22:57,610 --> 00:23:01,900 Vì vậy, điều này đã mở các tập tin cho bạn, đọc điểm ảnh pixel, 281 00:23:01,900 --> 00:23:04,510 và sau đó viết nó vào một tập tin đầu ra. 282 00:23:04,510 --> 00:23:07,080 >> Chúng ta hãy nhìn vào lúc đó. 283 00:23:13,390 --> 00:23:18,290 Điều này được đảm bảo sử dụng đúng cách, 284 00:23:18,290 --> 00:23:22,640 nhận được các tên tập tin ở đây. 285 00:23:22,640 --> 00:23:29,940 Điều này không có là nó đặt tập tin đầu vào những gì chúng ta đã vượt qua trong infile đây, 286 00:23:29,940 --> 00:23:34,750 đó là lần thứ hai đối số dòng lệnh. 287 00:23:34,750 --> 00:23:37,640 Kiểm tra để chắc chắn rằng chúng tôi có thể mở tập tin. 288 00:23:38,960 --> 00:23:44,860 Kiểm tra để chắc chắn rằng chúng tôi có thể làm cho một outfile mới ở đây. 289 00:23:45,630 --> 00:23:53,270 Sau đó, điều này không ở đây, nó chỉ về cơ bản bắt đầu đọc trong các tập tin bitmap từ đầu. 290 00:23:53,270 --> 00:23:56,700 Đầu, như chúng ta biết, có chứa các BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 và do đó, những trình tự của các bit sẽ trực tiếp điền vào các BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Vì vậy, những gì chúng tôi có ở đây là nói rằng bf BITMAPFILEHEADER - 293 00:24:07,940 --> 00:24:13,150 đó là biến mới của chúng ta về loại BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 chúng ta sẽ đặt bên trong bf những gì chúng ta đọc từ trong con trỏ, mà là infile của chúng tôi. 295 00:24:22,560 --> 00:24:23,970 Chúng ta đọc bao nhiêu? 296 00:24:23,970 --> 00:24:32,160 Chúng ta đọc trong chúng ta cần bao nhiêu byte để chứa các BITMAPFILEHEADER toàn bộ. 297 00:24:32,160 --> 00:24:34,660 Tương tự như vậy, đó là những gì chúng tôi làm cho các tiêu đề thông tin. 298 00:24:34,660 --> 00:24:39,010 Vì vậy, chúng tôi tiếp tục cùng tập tin của chúng tôi trong infile, 299 00:24:39,010 --> 00:24:44,360 và chúng tôi đang đọc các bit và byte, và chúng tôi đang cắm trực tiếp trong 300 00:24:44,360 --> 00:24:47,880 vào các trường hợp của các biến mà chúng tôi đang làm. 301 00:24:49,370 --> 00:24:53,800 Ở đây chúng ta chỉ cần đảm bảo rằng bitmap là một bitmap. 302 00:24:57,670 --> 00:25:01,030 >> Bây giờ chúng ta có một outfile, phải không? 303 00:25:01,030 --> 00:25:04,420 Vì vậy, nó là viết tắt khi chúng tôi tạo ra nó, cơ bản trống. 304 00:25:04,420 --> 00:25:07,710 Vì vậy, về cơ bản chúng ta phải tạo ra một bitmap mới từ đầu. 305 00:25:07,710 --> 00:25:12,280 Những gì chúng tôi làm là chúng ta phải đảm bảo rằng chúng tôi sao chép trong phần đầu tập tin 306 00:25:12,280 --> 00:25:16,850 và tiêu đề thông tin giống như các infile. 307 00:25:16,850 --> 00:25:22,850 Những gì chúng ta làm là viết - và hãy nhớ rằng bf là biến 308 00:25:22,850 --> 00:25:29,300 của loại BITMAPFILEHEADER, do đó, những gì chúng tôi làm là chúng ta chỉ cần sử dụng nội dung đó 309 00:25:29,300 --> 00:25:34,980 để viết vào các outfile. 310 00:25:36,550 --> 00:25:38,510 Ở đây, hãy nhớ chúng tôi đã nói về đệm, 311 00:25:38,510 --> 00:25:47,820 như thế nào cũng quan trọng để đảm bảo rằng số lượng điểm ảnh mà chúng tôi có là một bội số của 4. 312 00:25:47,820 --> 00:25:52,790 Đây là một công thức khá hữu ích để tính toán bao nhiêu đệm bạn có 313 00:25:52,790 --> 00:25:57,670 chiều rộng của tập tin của bạn. 314 00:25:57,670 --> 00:26:04,120 Tôi muốn các bạn phải nhớ rằng trong% s chúng ta có một công thức để tính đệm. 315 00:26:04,120 --> 00:26:07,970 Được không? Vì vậy mọi người hãy nhớ rằng. Lớn. 316 00:26:07,970 --> 00:26:14,050 Vì vậy, sau đó những gì% s tiếp theo là lặp đi lặp lại trên tất cả các scanlines. 317 00:26:14,050 --> 00:26:23,730 Nó đi qua các hàng đầu tiên và sau đó lưu giữ mọi gấp ba lần nó đọc 318 00:26:23,730 --> 00:26:26,920 và sau đó viết nó vào các outfile. 319 00:26:26,920 --> 00:26:33,120 Vì vậy, sau đó ở đây chúng tôi đang đọc chỉ có một RGB ba tại một thời điểm 320 00:26:33,120 --> 00:26:39,860 và sau đó đưa rằng ba cùng vào outfile. 321 00:26:41,120 --> 00:26:48,340 Phần khôn lanh là padding không phải là một triple RGB, 322 00:26:48,340 --> 00:26:55,200 và vì vậy chúng tôi có thể không chỉ cần đọc số tiền đó miếng đệm của ba RGB. 323 00:26:55,200 --> 00:27:01,460 Những gì chúng ta phải làm là thực sự chỉ cần di chuyển tập tin chỉ báo vị trí của chúng tôi, di chuyển con trỏ của chúng tôi, 324 00:27:01,460 --> 00:27:06,840 loại bỏ qua tất cả các lớp đệm để chúng tôi đang ở hàng tiếp theo. 325 00:27:06,840 --> 00:27:12,990 Và sau đó điều này không là bản sao cho bạn thấy làm thế nào bạn có thể muốn thêm các padding. 326 00:27:12,990 --> 00:27:14,990 Vì vậy, chúng tôi đã tính toán chúng ta cần bao nhiêu đệm, 327 00:27:14,990 --> 00:27:18,220 do đó có nghĩa rằng chúng ta cần số padding của số 0. 328 00:27:18,220 --> 00:27:24,510 Điều này không có một vòng lặp mà đặt số padding của số 0 vào outfile của chúng tôi. 329 00:27:24,510 --> 00:27:31,170 Và cuối cùng, bạn đóng cả hai tập tin. Bạn đóng infile cũng như outfile. 330 00:27:31,170 --> 00:27:34,870 >> Vậy đó là cách copy.c công trình, 331 00:27:34,870 --> 00:27:37,430 và đó sẽ là khá hữu ích. 332 00:27:39,720 --> 00:27:43,750 Thay vì chỉ thực sự trực tiếp sao chép và dán nó 333 00:27:43,750 --> 00:27:46,800 hoặc chỉ nhìn vào nó và gõ vào bất cứ điều gì bạn muốn, 334 00:27:46,800 --> 00:27:49,440 bạn chỉ có thể muốn thực hiện lệnh này trong thiết bị đầu cuối, 335 00:27:49,440 --> 00:27:54,520 cp% s whodunit.c, mà sẽ tạo ra một tập tin mới, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 có chứa nội dung chính xác giống như bản sao không. 337 00:27:58,330 --> 00:28:03,880 Vì vậy, sau đó chúng ta có thể làm gì được sử dụng như một khuôn khổ mà trên đó để xây dựng và chỉnh sửa 338 00:28:03,880 --> 00:28:06,900 cho tập tin whodunit của chúng tôi. 339 00:28:08,500 --> 00:28:14,670 >> Đây là những-to dos để làm cho Whodunit, nhưng những gì copy.c 340 00:28:14,670 --> 00:28:16,730 là thực sự chăm sóc của hầu hết trong số họ cho chúng tôi. 341 00:28:16,730 --> 00:28:21,900 Vì vậy, tất cả chúng ta cần phải làm gì tiếp theo là thay đổi các điểm ảnh khi cần thiết 342 00:28:21,900 --> 00:28:25,920 để thực sự làm cho các tập tin có thể đọc được. 343 00:28:25,920 --> 00:28:32,960 Hãy nhớ rằng một điểm ảnh cho ba, vì vậy cho một biến nhất định RGBTRIPLE loại, 344 00:28:32,960 --> 00:28:35,990 bạn có thể truy cập, các giá trị màu xanh, màu xanh lá cây, và màu đỏ. 345 00:28:35,990 --> 00:28:38,670 Đó là sẽ có ích bởi vì nếu bạn có thể truy cập chúng, 346 00:28:38,670 --> 00:28:41,770 điều đó có nghĩa là bạn cũng có thể kiểm tra xem chúng, 347 00:28:41,770 --> 00:28:45,430 và điều đó có nghĩa là bạn cũng có thể thay đổi chúng. 348 00:28:45,430 --> 00:28:49,430 >> Vì vậy, khi chúng tôi trở về ví dụ kính lúp màu đỏ của chúng tôi, 349 00:28:49,430 --> 00:28:53,390 về cơ bản, đã hành động như là một loại của các bộ lọc cho chúng tôi. 350 00:28:53,390 --> 00:28:58,160 Vì vậy, những gì chúng tôi muốn làm là chúng tôi muốn để lọc tất cả của ba đang đến. 351 00:28:58,160 --> 00:29:01,240 Có một số cách khác nhau để làm điều này. 352 00:29:01,240 --> 00:29:07,100 Về cơ bản, bạn có thể có bất cứ loại bộ lọc bạn muốn. 353 00:29:07,100 --> 00:29:09,890 Có lẽ bạn muốn thay đổi tất cả các điểm ảnh màu đỏ 354 00:29:09,890 --> 00:29:13,570 hoặc có thể bạn muốn thay đổi một điểm ảnh màu sắc khác nhau để một màu khác nhau. 355 00:29:13,570 --> 00:29:15,400 Đó là vào bạn. 356 00:29:15,400 --> 00:29:19,580 Hãy nhớ rằng bạn có thể kiểm tra những gì màu pixel 357 00:29:19,580 --> 00:29:23,000 và sau đó bạn cũng có thể thay đổi nó như là bạn đang trải qua. 358 00:29:24,410 --> 00:29:26,420 >> Okay. Vì vậy, đó là Whodunit. 359 00:29:26,420 --> 00:29:32,760 Một khi bạn chạy Whodunit, bạn sẽ biết ai là thủ phạm của tội phạm. 360 00:29:32,760 --> 00:29:35,540 >> Bây giờ chúng ta sẽ đi đến thay đổi kích cỡ. 361 00:29:35,540 --> 00:29:37,990 Chúng ta sẽ vẫn được giao dịch với bitmap. 362 00:29:37,990 --> 00:29:40,750 Những gì chúng ta sẽ làm là chúng ta sẽ có một bitmap đầu vào 363 00:29:40,750 --> 00:29:45,890 và sau đó chúng ta sẽ phải vượt qua trong một số và sau đó nhận được một bitmap outfile 364 00:29:45,890 --> 00:29:51,380 đó là về cơ bản infile của chúng tôi thu nhỏ lại bởi n. 365 00:29:54,670 --> 00:30:01,450 Tập tin của tôi chỉ là một ảnh lớn. 366 00:30:01,450 --> 00:30:09,100 Sau đó, nếu n của tôi là 3, mở rộng quy mô cho 3, sau đó tôi sẽ lặp lại rằng điểm ảnh n số lần, 367 00:30:09,100 --> 00:30:14,410 như vậy 3 lần, và sau đó cũng quy mô nó xuống 3 lần là tốt. 368 00:30:14,410 --> 00:30:17,840 Vì vậy, bạn thấy tôi đang mở rộng quy mô theo chiều dọc cũng như theo chiều ngang. 369 00:30:17,840 --> 00:30:19,680 >> Và sau đây là một ví dụ. 370 00:30:19,680 --> 00:30:27,590 Nếu bạn có n = 2, bạn thấy rằng màu xanh điểm ảnh đầu tiên có lặp đi lặp lại hai lần 371 00:30:27,590 --> 00:30:30,930 theo chiều ngang cũng như hai lần theo chiều dọc. 372 00:30:30,930 --> 00:30:38,040 Và sau đó vẫn tiếp tục trên, và do đó bạn có một nhân rộng trực tiếp của hình ảnh ban đầu của bạn bởi hai. 373 00:30:40,920 --> 00:30:47,600 >> Vì vậy, sau đó nếu chúng ta chi tiết giả cho điều này, chúng tôi muốn để mở các tập tin. 374 00:30:47,600 --> 00:30:49,880 Và sau đó biết rằng nếu chúng ta trở lại đây, 375 00:30:49,880 --> 00:30:54,540 chúng ta thấy rằng độ rộng cho các outfile là có được khác hơn chiều rộng cho infile. 376 00:30:54,540 --> 00:30:56,130 Điều đó có nghĩa là gì? 377 00:30:56,130 --> 00:31:01,230 Điều đó có nghĩa là thông tin tiêu đề của chúng tôi là sẽ thay đổi. 378 00:31:01,230 --> 00:31:03,790 Và như vậy chúng ta sẽ muốn làm là cập nhật các thông tin tiêu đề, 379 00:31:03,790 --> 00:31:11,820 biết rằng khi chúng ta đọc trong các tập tin nếu bạn đang hoạt động trên khung copy.c, 380 00:31:11,820 --> 00:31:17,570 chúng tôi đã có một biến cho biết kích thước và vật như thế. 381 00:31:17,570 --> 00:31:24,060 Vì vậy, một khi bạn đã có, những gì bạn có thể muốn làm là thay đổi các biến cụ thể. 382 00:31:24,060 --> 00:31:29,380 Hãy nhớ rằng, nếu bạn có một cấu trúc, làm thế nào bạn truy cập các biến bên trong. 383 00:31:29,380 --> 00:31:32,080 Bạn sử dụng các nhà điều hành chấm, phải không? 384 00:31:32,080 --> 00:31:36,420 Vì vậy, sau đó sử dụng đó, bạn biết rằng bạn sẽ cần phải thay đổi các thông tin tiêu đề. 385 00:31:36,480 --> 00:31:41,030 Vì vậy, đây chỉ là một danh sách các yếu tố thực tế sẽ được thay đổi trong file của bạn. 386 00:31:41,030 --> 00:31:45,180 Kích thước tập tin sẽ được thay đổi, hình ảnh, cũng như chiều rộng và chiều cao. 387 00:31:45,180 --> 00:31:50,080 Vì vậy, sau đó sẽ trở lại bản đồ của các bitmap, 388 00:31:50,080 --> 00:31:57,730 nhìn cho dù đó là phần đầu tập tin hoặc phần tiêu đề các thông tin có chứa thông tin đó 389 00:31:57,730 --> 00:32:00,920 và sau đó thay đổi khi cần thiết. 390 00:32:05,010 --> 00:32:12,470 Một lần nữa, nói cp% s resize.c. 391 00:32:12,470 --> 00:32:19,270 Điều đó có nghĩa rằng resize.c bây giờ chứa tất cả mọi thứ chứa bên trong bản sao 392 00:32:19,270 --> 00:32:24,490 bởi vì bản sao cung cấp cho chúng ta một cách đọc vào mỗi điểm ảnh scanline pixel. 393 00:32:24,490 --> 00:32:29,860 Ngoại trừ bây giờ, thay vì chỉ cần thay đổi các giá trị như chúng tôi đã làm trong Whodunit, 394 00:32:29,860 --> 00:32:37,980 những gì chúng tôi muốn làm là chúng ta muốn viết nhiều bằng pixel 395 00:32:37,980 --> 00:32:43,580 dài như n của chúng tôi là lớn hơn 1. 396 00:32:43,580 --> 00:32:47,110 >> Sau đó, những gì chúng tôi muốn làm là chúng tôi muốn để nó giãn ra theo chiều ngang bằng n, 397 00:32:47,110 --> 00:32:50,490 cũng như căng nó theo chiều dọc n. 398 00:32:50,490 --> 00:32:52,710 Làm thế nào chúng ta có thể làm điều này? 399 00:32:52,710 --> 00:32:56,890 Nói n của bạn là 2 bạn có infile cho. 400 00:32:56,890 --> 00:32:58,730 Con trỏ của bạn sẽ bắt đầu tại một trong những người đầu tiên, 401 00:32:58,730 --> 00:33:03,530 và những gì bạn muốn làm nếu n là 2, bạn muốn in 2 của những người. 402 00:33:03,530 --> 00:33:05,490 Vì vậy, bạn in 2 của những người. 403 00:33:05,490 --> 00:33:10,830 Sau đó, con trỏ chuột của bạn sẽ chuyển sang pixel tiếp theo, đó là màu đỏ, 404 00:33:10,830 --> 00:33:18,400 và nó sẽ in ra 2 của những màu đỏ, phụ thêm vào những gì nó được thực hiện trước khi. 405 00:33:18,400 --> 00:33:26,280 Sau đó con trỏ sẽ di chuyển đến các điểm ảnh tiếp theo và vẽ trong 2 của những người. 406 00:33:26,280 --> 00:33:37,180 Nếu bạn nhìn lại khuôn khổ copy.c, điều này không đúng ở đây 407 00:33:37,180 --> 00:33:42,830 là nó tạo ra một thể hiện mới của một triple RGB, một biến mới gọi là ba. 408 00:33:42,830 --> 00:33:50,500 Và ở đây khi nó đọc vào nó, nó đọc từ 1 infile RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 và lưu trữ nó bên trong mà biến ba. 410 00:33:53,470 --> 00:33:57,590 Vì vậy, sau đó bạn thực sự có một biến đại diện cho rằng điểm ảnh cụ thể. 411 00:33:57,590 --> 00:34:05,290 Sau đó, khi bạn viết, những gì bạn có thể muốn làm là bọc lấy các báo cáo fwrite vào một vòng lặp for 412 00:34:05,290 --> 00:34:11,080 mà viết nó vào outfile của bạn nhiều lần khi cần thiết. 413 00:34:17,449 --> 00:34:20,100 Đó là đơn giản. 414 00:34:20,200 --> 00:34:27,590 Chỉ cần về cơ bản lặp lại quá trình viết n số lần quy mô nó theo chiều ngang. 415 00:34:27,590 --> 00:34:32,969 >> Nhưng sau đó chúng ta phải nhớ rằng đệm của chúng tôi là sẽ thay đổi. 416 00:34:47,350 --> 00:34:53,020 Trước đây, nói rằng chúng tôi đã có một cái gì đó của độ dài 3. 417 00:34:53,020 --> 00:35:00,130 Sau đó, chúng tôi sẽ chỉ thêm vào bao nhiêu đệm? Chỉ cần thêm một để làm cho nó là bội số của 4. 418 00:35:00,130 --> 00:35:10,480 Nhưng nói rằng chúng tôi đang nhân rộng hình ảnh này đặc biệt bởi n = 2. 419 00:35:10,480 --> 00:35:16,300 Vì vậy, sau đó chúng ta sẽ có bao nhiêu điểm ảnh màu xanh ở cuối? Chúng tôi sẽ có 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. Được rồi. 421 00:35:21,470 --> 00:35:26,580 6 không phải là một bội số của 4. Bội số gần nhất của 4 là gì? Đó sẽ là 8. 422 00:35:26,580 --> 00:35:33,200 Vì vậy, chúng tôi đang thực sự sẽ có 2 ký tự của padding có. 423 00:35:33,200 --> 00:35:38,720 >> Có ai nhớ nếu chúng ta có một công thức để tính toán đệm 424 00:35:38,720 --> 00:35:41,350 và có thể được? 425 00:35:41,350 --> 00:35:45,160 [Không nghe được sinh viên phản ứng] >> Yeah, copy.c. Đúng. 426 00:35:45,160 --> 00:35:49,800 Có một công thức trong% s để tính toán bao nhiêu đệm bạn có 427 00:35:49,800 --> 00:35:53,810 có chiều rộng cụ thể của hình ảnh bitmap. 428 00:35:53,810 --> 00:36:02,950 Vì vậy, sau đó sẽ có ích khi bạn cần phải thêm vào một số tiền nhất định của padding 429 00:36:02,950 --> 00:36:06,160 để thực sự tìm ra bao nhiêu đệm bạn cần phải thêm. 430 00:36:10,820 --> 00:36:15,850 Nhưng có một lưu ý, mặc dù, là bạn muốn làm cho chắc chắn rằng bạn đang sử dụng đúng kích cỡ. 431 00:36:15,850 --> 00:36:21,410 Chỉ cần cẩn thận bởi vì về cơ bản bạn sẽ được giao dịch với hai hình ảnh bitmap. 432 00:36:21,410 --> 00:36:23,410 Bạn muốn đảm bảo rằng bạn đang sử dụng một trong những quyền. 433 00:36:23,410 --> 00:36:26,820 Khi bạn đang tính toán padding cho outfile, bạn muốn sử dụng độ rộng của outfile 434 00:36:26,820 --> 00:36:29,860 và không phải là chiều rộng của phần trước đó. 435 00:36:29,860 --> 00:36:37,240 >> Lớn. Đó là loại chăm sóc kéo dài toàn bộ một hình ảnh bitmap theo chiều ngang. 436 00:36:37,240 --> 00:36:41,290 Nhưng những gì chúng tôi muốn làm là thực sự căng nó theo chiều dọc cũng. 437 00:36:41,290 --> 00:36:48,760 Điều này là có được một chút phức tạp hơn bởi vì khi chúng tôi đã hoàn tất việc sao chép một hàng 438 00:36:48,760 --> 00:36:51,580 và viết hàng đó, con trỏ của chúng tôi là có được ở cuối. 439 00:36:51,580 --> 00:36:56,210 Vì vậy, nếu chúng ta đọc một lần nữa, sau đó nó chỉ để đọc đến dòng kế tiếp. 440 00:36:56,210 --> 00:37:03,660 Vì vậy, những gì chúng tôi muốn làm là loại tìm thấy một số cách sao chép những hàng một lần nữa 441 00:37:03,660 --> 00:37:12,500 hoặc chỉ cần loại hàng đó và sau đó viết lại nó một lần nữa. 442 00:37:14,380 --> 00:37:17,940 Như tôi đã loại ám chỉ, có một số cách khác nhau để làm điều này. 443 00:37:17,940 --> 00:37:23,040 Những gì bạn có thể làm như bạn đang trải qua và đọc thông qua các scanline cụ thể 444 00:37:23,040 --> 00:37:28,560 và thay đổi nó khi cần thiết, sau đó loại của các cửa hàng tất cả những điểm ảnh trong một mảng. 445 00:37:28,560 --> 00:37:36,350 Sau đó, sau này bạn biết rằng bạn sẽ cần để in ra mảng đó một lần nữa, 446 00:37:36,350 --> 00:37:39,830 và do đó bạn chỉ có thể sử dụng mảng để làm điều đó. 447 00:37:39,830 --> 00:37:44,500 Một cách khác để làm điều đó là bạn có thể sao chép một hàng, 448 00:37:44,500 --> 00:37:47,950 hiểu rằng bạn cần phải sao chép đó một lần nữa, do đó, thực sự di chuyển con trỏ của bạn, 449 00:37:47,950 --> 00:37:50,950 và đó sẽ được sử dụng fseek phương pháp. 450 00:37:50,950 --> 00:37:56,410 Bạn có thể di chuyển con trỏ của bạn tất cả các cách trở lại và sau đó lặp lại quá trình sao chép một lần nữa. 451 00:37:56,410 --> 00:38:03,960 >> Vì vậy, nếu số mở rộng quy mô của chúng tôi là n, sau đó bao nhiêu lần chúng tôi phải quay trở lại 452 00:38:03,960 --> 00:38:10,500 và viết lại một dòng? >> [Sinh viên] n - 1. >> Yeah, hoàn hảo. n - 1. 453 00:38:10,500 --> 00:38:14,390 Chúng tôi đã thực hiện nó một lần rồi, do đó, sau đó chúng tôi sẽ muốn lặp lại quá trình trở lại 454 00:38:14,390 --> 00:38:17,460 n - 1 số lần. 455 00:38:22,730 --> 00:38:25,860 Okay. Như vậy, có bạn có chức năng thay đổi kích cỡ của bạn. 456 00:38:25,860 --> 00:38:34,360 >> Bây giờ chúng ta có thể nhận được một phần thực sự thú vị, pset yêu thích của tôi, đó là phục hồi. 457 00:38:34,360 --> 00:38:39,580 Thay vì bitmap, lần này chúng tôi đang làm việc với các hình ảnh JPEG. 458 00:38:39,580 --> 00:38:43,370 Chúng tôi đang thực sự không đưa ra một tập tin chỉ của hình ảnh JPEG, 459 00:38:43,370 --> 00:38:46,600 chúng tôi đang đưa ra cơ bản là một định dạng thẻ nhớ liệu. 460 00:38:46,600 --> 00:38:51,790 Và do đó, điều này có một chút giá trị thông tin và rác trong đầu, 461 00:38:51,790 --> 00:38:57,240 và sau đó nó bắt đầu và nó có một loạt các tập tin JPEG. 462 00:38:57,240 --> 00:39:03,430 Tuy nhiên, chúng tôi bàn giao một thẻ mà chúng tôi đã xóa các hình ảnh; 463 00:39:03,430 --> 00:39:08,300 về cơ bản, chúng tôi đã quên nơi các bức ảnh được nằm trong thẻ. 464 00:39:08,300 --> 00:39:12,770 Vì vậy, sau đó nhiệm vụ của chúng tôi trong phục hồi là để đi thông qua định dạng thẻ này 465 00:39:12,770 --> 00:39:16,500 và tìm thấy những hình ảnh một lần nữa. 466 00:39:16,500 --> 00:39:23,990 >> May mắn thay, cấu trúc của các tập tin JPEG và các tập tin thẻ là một chút hữu ích. 467 00:39:23,990 --> 00:39:28,850 Nó chắc chắn có thể có được một chút phức tạp hơn nếu nó không được ở định dạng này cụ thể. 468 00:39:28,850 --> 00:39:40,160 Mỗi tập tin JPEG thực sự bắt đầu với hai chuỗi có thể được liệt kê ở trên. 469 00:39:40,160 --> 00:39:42,970 Về cơ bản, bất cứ khi nào bạn có một tập tin JPEG mới, 470 00:39:42,970 --> 00:39:52,720 nó bắt đầu với trình tự ffd8 ffe0 hay khác, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Một điều hữu ích để biết là hình ảnh JPEG được lưu trữ liên tục kế nhau. 472 00:39:59,530 --> 00:40:03,380 Vì vậy, bất cứ khi nào file JPEG 1 kết thúc, một trong những khác bắt đầu. 473 00:40:03,380 --> 00:40:07,070 Vì vậy, không phải là bất kỳ loại trong giữa các giá trị đó. 474 00:40:07,070 --> 00:40:15,510 Một khi bạn nhấn bắt đầu của một JPEG, nếu bạn đã được đọc một ảnh JPEG, 475 00:40:15,510 --> 00:40:21,800 bạn biết rằng bạn đã nhấn kết thúc trước đó và bắt đầu của một trong những tiếp theo. 476 00:40:21,800 --> 00:40:25,890 >> Loại hình này, tôi đã thực hiện một sơ đồ. 477 00:40:25,890 --> 00:40:36,910 Một điều về hình ảnh JPEG là chúng ta có thể đọc chúng trong trình tự của 512 byte tại một thời điểm, 478 00:40:36,910 --> 00:40:39,380 tương tự với sự khởi đầu của thẻ. 479 00:40:39,380 --> 00:40:43,370 Chúng tôi không cần phải được kiểm tra tất cả các byte duy nhất vì đó sẽ hút. 480 00:40:43,370 --> 00:40:48,200 Vì vậy, thay vào đó, những gì chúng ta có thể làm là thực sự chỉ cần đọc 512 byte tại một thời điểm 481 00:40:48,200 --> 00:40:54,700 và sau đó, thay vì kiểm tra ở giữa những người trong những lát nhỏ nhỏ, 482 00:40:54,700 --> 00:40:58,640 chúng tôi chỉ có thể kiểm tra đầu 512 byte. 483 00:40:58,640 --> 00:41:02,570 Về cơ bản, trong bức tranh này, những gì bạn thấy là trong đầu của thẻ, 484 00:41:02,570 --> 00:41:08,700 bạn có giá trị mà không phải là thực sự có liên quan đến các hình ảnh JPEG thực tế bản thân. 485 00:41:08,700 --> 00:41:15,830 Nhưng sau đó những gì tôi có là một ngôi sao để cho biết một trong hai chuỗi khởi đầu cho một ảnh JPEG. 486 00:41:15,830 --> 00:41:19,910 Vì vậy, bất cứ khi nào bạn nhìn thấy một ngôi sao, bạn biết rằng bạn có một tập tin JPEG. 487 00:41:19,910 --> 00:41:25,030 Và sau đó tất cả các tập tin JPEG sẽ là bội số của 512 byte 488 00:41:25,030 --> 00:41:27,880 nhưng không nhất thiết phải là nhiều. 489 00:41:27,880 --> 00:41:32,050 Cách mà bạn biết rằng bạn đã đạt khác JPEG là nếu bạn nhấn một ngôi sao khác, 490 00:41:32,050 --> 00:41:39,090 một chuỗi bắt đầu của byte. 491 00:41:39,090 --> 00:41:43,330 Sau đó, những gì bạn có ở đây là bạn có tập tin JPEG đỏ tiếp tục cho đến khi bạn nhấn một ngôi sao, 492 00:41:43,330 --> 00:41:45,150 được chỉ định bởi một màu sắc mới. 493 00:41:45,150 --> 00:41:48,510 Bạn tiếp tục và sau đó bạn nhấn một ngôi sao khác, bạn nhấn khác JPEG, 494 00:41:48,510 --> 00:41:50,590 bạn tiếp tục tất cả các con đường cho đến khi kết thúc. 495 00:41:50,590 --> 00:41:53,180 Bạn đang ở hình ảnh cuối cùng ở đây, màu hồng. 496 00:41:53,180 --> 00:41:58,220 Bạn đi đến cùng cho đến khi bạn nhấn kết thúc của tập tin ký tự. 497 00:41:58,220 --> 00:42:00,820 Điều này sẽ thực sự hữu ích. 498 00:42:00,820 --> 00:42:03,170 >> Takeaways chủ yếu ở đây: 499 00:42:03,170 --> 00:42:06,670 Các tập tin thẻ không bắt đầu với một JPEG, 500 00:42:06,670 --> 00:42:13,350 nhưng khi JPEG bắt đầu, tất cả các hình ảnh JPEG được lưu trữ bên cạnh nhau. 501 00:42:17,520 --> 00:42:20,420 >> Một số giả cho phần Recover. 502 00:42:20,420 --> 00:42:22,570 Đầu tiên, chúng ta sẽ mở tập tin thẻ của chúng tôi, 503 00:42:22,570 --> 00:42:27,500 và đó là sẽ được sử dụng tập tin của chúng tôi I / O chức năng. 504 00:42:27,500 --> 00:42:32,430 Chúng ta sẽ lặp lại quá trình sau đây cho đến khi chúng tôi đã đạt đến kết thúc của tập tin. 505 00:42:32,430 --> 00:42:36,450 Chúng ta sẽ đọc 512 byte tại một thời điểm. 506 00:42:36,450 --> 00:42:39,180 Và những gì tôi nói ở đây là chúng ta đang đi để lưu trữ nó trong một bộ đệm, 507 00:42:39,180 --> 00:42:46,230 do đó, về cơ bản giữ trên 512 byte cho đến khi chúng ta biết chính xác những gì để làm với họ. 508 00:42:46,230 --> 00:42:50,300 Sau đó, những gì chúng tôi muốn làm là chúng tôi muốn để kiểm tra xem chúng tôi đã đạt một ngôi sao hay không. 509 00:42:50,300 --> 00:42:57,960 Nếu chúng tôi đã đạt một ngôi sao, nếu chúng tôi đã đạt một trình tự bắt đầu, 510 00:42:57,960 --> 00:42:59,980 sau đó chúng tôi biết rằng chúng tôi đã trúng một file JPEG. 511 00:42:59,980 --> 00:43:08,860 Những gì chúng tôi muốn làm là chúng ta sẽ muốn để tạo ra một tập tin mới trong thư mục pset4 của chúng tôi 512 00:43:08,860 --> 00:43:14,480 tiếp tục làm cho tập tin đó. 513 00:43:14,480 --> 00:43:18,220 Nhưng cũng có thể, nếu chúng ta đã thực hiện một JPEG, 514 00:43:18,220 --> 00:43:25,620 sau đó chúng tôi muốn kết thúc tập tin đó và đẩy nó vào thư mục pset4, 515 00:43:25,620 --> 00:43:29,780 mà chúng ta sẽ có tập tin được lưu trữ bởi vì nếu chúng ta không xác định mà chúng tôi đã kết thúc mà JPEG, 516 00:43:29,780 --> 00:43:37,290 sau đó chúng tôi về cơ bản sẽ có một số lượng không xác định. Các hình ảnh JPEG không bao giờ sẽ kết thúc. 517 00:43:37,290 --> 00:43:40,840 Vì vậy, chúng tôi muốn đảm bảo rằng khi chúng ta đang đọc vào một tập tin JPEG và văn bản rằng, 518 00:43:40,840 --> 00:43:46,590 chúng tôi muốn đặc biệt gần đó để mở một trong những kế tiếp. 519 00:43:46,590 --> 00:43:48,430 Chúng tôi sẽ muốn kiểm tra một vài điều. 520 00:43:48,430 --> 00:43:52,880 Chúng tôi muốn kiểm tra xem chúng ta đang ở bắt đầu của một JPEG mới với bộ đệm của chúng tôi 521 00:43:52,880 --> 00:43:56,780 và cũng có thể nếu chúng ta đã tìm thấy một ảnh JPEG trước 522 00:43:56,780 --> 00:44:03,930 bởi vì đó sẽ thay đổi quá trình của bạn một chút. 523 00:44:03,930 --> 00:44:07,880 Vì vậy, sau đó sau khi bạn đi qua tất cả các cách và bạn nhấn vào cuối của tập tin, 524 00:44:07,880 --> 00:44:11,570 sau đó những gì bạn sẽ muốn làm là bạn sẽ muốn đóng tất cả các tập tin đang mở. 525 00:44:11,570 --> 00:44:14,100 Điều đó có lẽ sẽ là JPEG cuối cùng tập tin mà bạn có, 526 00:44:14,100 --> 00:44:18,930 cũng như các tập tin thẻ mà bạn đã được giao dịch với. 527 00:44:21,940 --> 00:44:28,670 >> Trở ngại cuối cùng mà chúng ta cần phải giải quyết là làm thế nào để thực sự làm cho một tập tin JPEG 528 00:44:28,670 --> 00:44:31,950 và làm thế nào để thực sự đẩy nó vào thư mục. 529 00:44:33,650 --> 00:44:39,850 Pset yêu cầu mỗi JPEG mà bạn tìm thấy được trong các định dạng sau đây, 530 00:44:39,850 --> 00:44:43,990 nơi bạn có số jpg. 531 00:44:43,990 --> 00:44:50,750 Số lượng, ngay cả khi nó là 0, chúng ta gọi nó 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Bất cứ khi nào bạn tìm thấy một JPEG trong chương trình của bạn, 533 00:44:55,730 --> 00:44:58,040 bạn sẽ muốn đặt tên nó theo thứ tự mà nó được tìm thấy. 534 00:44:58,040 --> 00:44:59,700 Điều này có nghĩa là gì? 535 00:44:59,700 --> 00:45:03,530 Chúng ta cần phải loại theo dõi của chúng tôi đã tìm thấy bao nhiêu 536 00:45:03,530 --> 00:45:08,680 và số lượng của mỗi JPEG nên được. 537 00:45:08,680 --> 00:45:13,800 Ở đây chúng ta sẽ tận dụng lợi thế của chức năng sprintf. 538 00:45:13,800 --> 00:45:17,480 Tương tự như printf, mà chỉ cần loại in một giá trị vào thiết bị đầu cuối, 539 00:45:17,480 --> 00:45:23,910 sprintf in các tập tin vào thư mục. 540 00:45:23,910 --> 00:45:30,870 Và vì vậy điều này sẽ làm gì nếu tôi đã có sprintf, tiêu đề, và sau đó các chuỗi có, 541 00:45:30,870 --> 00:45:36,660 nó sẽ in ra 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Giả sử rằng tôi đã đóng các tập tin của tôi một cách chính xác, 543 00:45:41,020 --> 00:45:47,210 mà có thể chứa các tập tin mà tôi đã được viết ra. 544 00:45:47,210 --> 00:45:50,320 Nhưng có một điều là mã mà tôi có ở đây 545 00:45:50,320 --> 00:45:53,360 không hoàn toàn đáp ứng những gì pset yêu cầu. 546 00:45:53,360 --> 00:46:02,410 Pset yêu cầu rằng các tập tin JPEG thứ hai nên được đặt tên là 002 thay vì chỉ 2. 547 00:46:02,410 --> 00:46:09,160 Vì vậy, khi bạn in ra tên, sau đó có lẽ bạn có thể muốn thay đổi giữ chỗ hơi. 548 00:46:09,160 --> 00:46:18,140 >> Có ai nhớ làm thế nào chúng ta cho phép cho các không gian phụ khi chúng tôi in một cái gì đó? 549 00:46:18,140 --> 00:46:22,530 Yeah. >> [Sinh viên] Bạn đặt 3 giữa dấu phần trăm và 2. >> Yeah, hoàn hảo. 550 00:46:22,530 --> 00:46:25,610 Bạn sẽ đặt một 3 trong trường hợp này bởi vì chúng tôi muốn có không gian cho 3. 551 00:46:25,610 --> 00:46:32,590 % 3d có lẽ sẽ cung cấp cho bạn 002.jpg thay vì 2. 552 00:46:32,590 --> 00:46:40,120 Đối số đầu tiên vào các chức năng sprintf thực sự là một mảng char, 553 00:46:40,120 --> 00:46:42,520 mà trước đây chúng tôi biết như dây đàn. 554 00:46:42,520 --> 00:46:50,700 Những ý chí, loại giống như một lưu trữ tạm thời, chỉ cần lưu trữ các chuỗi kết quả. 555 00:46:50,700 --> 00:46:54,950 Bạn sẽ không thực sự được giao dịch với điều này, nhưng bạn cần phải bao gồm nó. 556 00:46:54,950 --> 00:47:00,710 >> Biết rằng tất cả các tên tập tin có số lượng, trong đó có ba nhân vật, 557 00:47:00,710 --> 00:47:06,770 và sau đó jpg, bao lâu mảng này nên được? 558 00:47:09,070 --> 00:47:14,310 Vứt bỏ một số. Bao nhiêu ký tự trong tiêu đề, trong tên? 559 00:47:18,090 --> 00:47:26,320 Vì vậy, có 3 hashtags, thời gian, jpg. >> [Sinh viên] 7. >> 7. Không khá. 560 00:47:26,320 --> 00:47:32,000 Chúng tôi sẽ muốn 8 bởi vì chúng tôi muốn để cho phép cho terminator vô giá trị như. 561 00:47:45,340 --> 00:47:49,730 >> Cuối cùng, chỉ để rút ra quá trình mà bạn sẽ được làm cho Recover, 562 00:47:49,730 --> 00:47:55,420 bạn có một số thông tin bắt đầu. 563 00:47:55,420 --> 00:48:02,460 Bạn tiếp tục cho đến khi bạn tìm thấy sự bắt đầu của một tập tin JPEG, 564 00:48:02,460 --> 00:48:07,900 và đó có thể hoặc là một trong hai chuỗi bắt đầu. 565 00:48:07,900 --> 00:48:12,510 Bạn tiếp tục đọc. Mỗi dấu gạch chéo ở đây đại diện 512 byte. 566 00:48:12,510 --> 00:48:22,630 Bạn tiếp tục đọc, viết, tiếp tục đọc cho đến khi bạn gặp phải một chuỗi bắt đầu. 567 00:48:22,630 --> 00:48:29,790 Một khi bạn đã có, bạn kết thúc JPEG hiện tại - trong trường hợp này, đó là màu đỏ, 568 00:48:29,790 --> 00:48:31,030 vì vậy bạn muốn kết thúc điều đó. 569 00:48:31,030 --> 00:48:35,540 Bạn muốn tên sprintf đó vào thư mục pset4 của bạn, 570 00:48:35,540 --> 00:48:41,580 sau đó bạn muốn mở một JPEG mới và sau đó tiếp tục đọc 571 00:48:41,580 --> 00:48:46,370 cho đến khi bạn gặp tiếp theo. 572 00:48:46,370 --> 00:48:49,040 Hãy đọc, tiếp tục đọc, 573 00:48:49,040 --> 00:48:56,290 và sau đó cuối cùng, cuối cùng, bạn sẽ đạt được kết thúc của tập tin, 574 00:48:56,290 --> 00:49:00,360 và do đó bạn sẽ muốn để đóng JPEG cuối cùng mà bạn đang làm việc với, 575 00:49:00,360 --> 00:49:08,380 sprintf rằng vào thư mục pset4 của bạn, và sau đó nhìn vào tất cả những hình ảnh mà bạn đã nhận được. 576 00:49:08,380 --> 00:49:12,050 Những hình ảnh thực sự hình ảnh của CS50 nhân viên, 577 00:49:12,050 --> 00:49:16,430 và vì vậy đây là phần thú vị tiền thưởng của các pset đến 578 00:49:16,430 --> 00:49:26,310 là bạn đang cạnh tranh trong các phần của bạn để tìm thấy những TFs trong những hình ảnh 579 00:49:26,310 --> 00:49:34,610 và chụp ảnh với họ để chứng minh rằng bạn đã thực hiện pset 580 00:49:34,610 --> 00:49:37,030 và do đó bạn có thể xem những nhân viên trong các hình ảnh. 581 00:49:37,030 --> 00:49:41,510 Vì vậy, sau đó bạn chụp ảnh với các nhân viên. Đôi khi bạn sẽ phải đuổi theo họ. 582 00:49:41,510 --> 00:49:44,680 Có lẽ một số người trong số họ sẽ cố gắng để chạy ra khỏi bạn. 583 00:49:44,680 --> 00:49:47,320 Bạn chụp ảnh với họ. 584 00:49:47,320 --> 00:49:51,190 Điều này được thực hiện liên tục. Nó không phải do khi pset là do. 585 00:49:51,190 --> 00:49:53,340 Thời hạn cuối cùng sẽ được công bố trong spec. 586 00:49:53,340 --> 00:49:58,060 Sau đó, cùng với trang web của bạn, tùy theo điều kiện nào phần mất hầu hết các hình ảnh 587 00:49:58,060 --> 00:50:04,430 với hầu hết các nhân viên sẽ giành chiến thắng một giải thưởng khá awesome. 588 00:50:04,430 --> 00:50:08,890 Đó là loại động cơ để có được pset4 bạn đã hoàn thành càng nhanh càng tốt 589 00:50:08,890 --> 00:50:10,820 bởi vì sau đó bạn có thể nhận được xuống để kinh doanh 590 00:50:10,820 --> 00:50:14,570 săn bắn xuống tất cả các CS50 nhân viên khác nhau. 591 00:50:14,570 --> 00:50:17,500 Đó không phải là bắt buộc, mặc dù, vì vậy một khi bạn có được những hình ảnh, 592 00:50:17,500 --> 00:50:20,310 sau đó bạn đã kết thúc với pset4. 593 00:50:20,310 --> 00:50:23,970 >> Và tôi đã kết thúc với Walkthrough 4, do đó, cảm ơn tất cả các bạn vì đã đến. 594 00:50:23,970 --> 00:50:29,330 Chúc may mắn với Forensics. [Vỗ tay] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]