1 00:00:00,000 --> 00:00:10,210 >> [MUSIC CHƠI] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Hãy thổi mọi thứ với thay đổi kích cỡ. 3 00:00:13,320 --> 00:00:17,710 Trong thay đổi kích cỡ, người dùng sẽ vượt qua trong, thông qua dòng lệnh, một hình ảnh bitmap 4 00:00:17,710 --> 00:00:21,860 họ muốn bạn để mở rộng bởi một số rằng họ cũng vượt qua trong, 5 00:00:21,860 --> 00:00:23,770 trong dòng lệnh. 6 00:00:23,770 --> 00:00:24,690 Làm thế nào để chúng tôi làm điều này? 7 00:00:24,690 --> 00:00:28,270 >> Vâng, điều đầu tiên đầu tiên, chúng ta hãy phá vỡ này thành các bước. 8 00:00:28,270 --> 00:00:31,510 Bạn sẽ muốn mở infile họ cung cấp cho bạn, cũng như 9 00:00:31,510 --> 00:00:35,560 tạo và mở outfile mà bạn sẽ đặt 10 00:00:35,560 --> 00:00:38,020 hình ảnh thay đổi kích cỡ in 11 00:00:38,020 --> 00:00:42,050 Sau đó, bởi vì bạn đang thay đổi kích thước, và bởi vì đó là một bitmap, cho nó một tiêu đề, vì vậy 12 00:00:42,050 --> 00:00:46,080 bạn sẽ còn cập nhật các tiêu đề thông tin cho outfile, 13 00:00:46,080 --> 00:00:47,950 và viết rằng in 14 00:00:47,950 --> 00:00:51,850 Sau đó, bạn sẽ đọc vào các scanline của infile, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, thay đổi kích thước theo chiều ngang và viết những điểm ảnh vào 16 00:00:56,890 --> 00:01:00,910 outfile, theo quy định bởi quy mô của người dùng. 17 00:01:00,910 --> 00:01:03,940 >> Bạn sẽ nhớ thêm đệm khi cần thiết. 18 00:01:03,940 --> 00:01:05,400 Thêm về điều này sau. 19 00:01:05,400 --> 00:01:07,790 Và sau đó, cũng thay đổi kích thước theo chiều dọc. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Vì vậy, đây là có được nhiều hơn một chút phức tạp hơn ai thực hiện nó, nhưng 22 00:01:13,280 --> 00:01:18,310 những gì tương tự như là copy.c sẽ, một lần nữa, chứng minh rất hữu ích. 23 00:01:18,310 --> 00:01:23,160 Hãy nhớ rằng copy.c mở một tập tin, cập nhật các thông tin tiêu đề cho 24 00:01:23,160 --> 00:01:28,250 outfile, sau đó đọc vào scanline, pixel-by-pixel, viết mỗi điểm ảnh 25 00:01:28,250 --> 00:01:30,510 vào scanline các tập tin đầu ra. 26 00:01:30,510 --> 00:01:37,040 >> Vì vậy, một lần nữa, bước đầu tiên của bạn có thể có thể được cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 vào thư mục PSET5 của bạn. 28 00:01:40,560 --> 00:01:43,920 Nhớ mặc dù, trước khi bạn sao chép nó, để đảm bảo rằng bạn hiểu 29 00:01:43,920 --> 00:01:46,600 copy.c rất kỹ lưỡng. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Vì vậy, hãy mở một tập tin. 32 00:01:49,880 --> 00:01:50,870 Bạn biết làm thế nào để làm điều đó. 33 00:01:50,870 --> 00:01:52,600 Tôi sẽ để lại đó cho bạn. 34 00:01:52,600 --> 00:01:56,050 Tiếp theo, cập nhật các thông tin tiêu đề cho outfile. 35 00:01:56,050 --> 00:01:59,240 Bởi vì chúng ta có một bitmap mới, chúng tôi có thông tin mới tiêu đề. 36 00:01:59,240 --> 00:02:00,970 Có gì thay đổi ở đây? 37 00:02:00,970 --> 00:02:06,000 Tốt, kích thước tập tin là sẽ thay đổi bởi vì chúng ta sẽ có nhiều 38 00:02:06,000 --> 00:02:07,900 pixel so với trước đây. 39 00:02:07,900 --> 00:02:11,060 Kích thước hình ảnh là, do đó, cũng sẽ thay đổi, như là 40 00:02:11,060 --> 00:02:13,050 chiều rộng và chiều cao. 41 00:02:13,050 --> 00:02:17,180 >> Vì vậy, đó là những biến, chính xác? 42 00:02:17,180 --> 00:02:20,960 Vâng, nếu bạn nhìn vào tiêu đề thông tin, bạn sẽ thấy có 43 00:02:20,960 --> 00:02:25,640 biSizeImage, đại diện cho tổng số kích thước của hình ảnh trong byte, 44 00:02:25,640 --> 00:02:28,340 bao gồm các điểm ảnh và padding. 45 00:02:28,340 --> 00:02:32,520 biWidth là chiều rộng của hình ảnh trong điểm ảnh, âm đệm. 46 00:02:32,520 --> 00:02:35,580 biHeight là chiều cao của hình ảnh theo pixel. 47 00:02:35,580 --> 00:02:39,200 Và do đó, những được chứa trong cấu trúc và BITMAPFILEHEADER 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Bạn có thể nói đó là một trong mà theo sẽ bmp.h và nhìn vào 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER cấu trúc và nhìn thấy mà biến được liệt kê ở đó. 51 00:02:49,670 --> 00:02:54,700 >> Vì vậy, để cập nhật tiêu đề outfiles thông tin, bạn sẽ muốn 52 00:02:54,700 --> 00:02:57,025 thay đổi các giá trị của chiều cao và chiều rộng. 53 00:02:57,025 --> 00:03:00,570 Nhưng rất có thể là, bạn có thể cần một số của thông tin tiêu đề của infile 54 00:03:00,570 --> 00:03:03,670 sau đó, vì vậy tốt nhất để theo dõi cả hai. 55 00:03:03,670 --> 00:03:07,770 Nhưng rất rõ ràng với biến của bạn tên để bạn không vô tình 56 00:03:07,770 --> 00:03:12,490 viết các giá trị không chính xác trong tiêu đề cho outfile. 57 00:03:12,490 --> 00:03:16,160 >> Vì vậy, bây giờ chúng ta hãy để đọc vào các scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Một lần nữa, chúng ta sẽ chuyển sang đáng tin cậy của chúng tôi nộp I / O thư viện, và nhìn vào 59 00:03:20,210 --> 00:03:22,100 chức năng fread. 60 00:03:22,100 --> 00:03:26,150 fread mất trong một con trỏ đến một cấu trúc sẽ chứa các byte 61 00:03:26,150 --> 00:03:30,130 bạn đang đọc trong, kích thước của mỗi yếu tố mà bạn đang đọc - 62 00:03:30,130 --> 00:03:34,410 một lần nữa, sizeof sẽ là hữu ích hoạt động ở đây, số lượng các 63 00:03:34,410 --> 00:03:38,820 các yếu tố kích thước, kích thước, mà bạn đọc trong, và sau đó cuối cùng, 64 00:03:38,820 --> 00:03:41,310 inpointer, các tập tin mà bạn đang đọc từ. 65 00:03:41,310 --> 00:03:46,770 Vì vậy, bạn đang dùng các yếu tố số kích thước từ inpointer, và 66 00:03:46,770 --> 00:03:49,040 đưa vào dữ liệu. 67 00:03:49,040 --> 00:03:51,695 >> Bây giờ là lúc để thay đổi kích thước theo chiều ngang. 68 00:03:51,695 --> 00:03:56,880 nếu n bằng 2, sau đó cho mỗi điểm ảnh trong các infile, chúng ta sẽ viết nó 69 00:03:56,880 --> 00:04:00,870 hai lần trong outfile. 70 00:04:00,870 --> 00:04:02,210 Làm thế nào để chúng ta viết các tập tin? 71 00:04:02,210 --> 00:04:06,400 Vâng, chúng tôi có chức năng fwrite, vì vậy chúng tôi đã đưa con trỏ đến cấu trúc 72 00:04:06,400 --> 00:04:10,170 có chứa các byte mà bạn viết từ, và sau đó chúng tôi vượt qua trong 73 00:04:10,170 --> 00:04:14,430 kích thước, số lượng, và đầu ra, nơi bạn sẽ được viết đó. 74 00:04:14,430 --> 00:04:19,200 Và sau đó lặp lại một quá trình, sẽ có thể lặp đi lặp lại một đơn giản cho vòng lặp. 75 00:04:19,200 --> 00:04:21,740 >> Nhưng chúng ta cần nhớ thêm đệm in 76 00:04:21,740 --> 00:04:26,040 Các khái niệm về đệm là, tốt, mỗi điểm ảnh là ba cắn, nhưng 77 00:04:26,040 --> 00:04:28,940 kích thước của mỗi scanline phải là bội số của 4 byte. 78 00:04:28,940 --> 00:04:33,660 Vì vậy, nếu số lượng điểm ảnh không phải là một bội số của 4, chúng ta cần thêm một số 79 00:04:33,660 --> 00:04:36,630 đệm, mà chỉ là zero. 80 00:04:36,630 --> 00:04:42,130 Bây giờ, không giống như Ai thực hiện nó, và không giống như bản sao, sau đó hình ảnh infile và 81 00:04:42,130 --> 00:04:44,370 tập tin outfile đã khác nhau có đệm khác nhau bởi vì chúng 82 00:04:44,370 --> 00:04:46,360 độ rộng khác nhau. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Vì vậy, có lẽ là một công thức sẽ có ích ở đây. 85 00:04:51,050 --> 00:04:55,120 Tôi sẽ để lại nó cho bạn để tìm thấy nó ra, nhưng nói với bạn rằng, để viết đệm, 86 00:04:55,120 --> 00:04:59,360 tốt, nó chỉ là một chức năng fputc đơn giản, đi qua trong nhân vật 87 00:04:59,360 --> 00:05:02,200 mà bạn muốn viết, và sau đó con trỏ tập tin mà bạn 88 00:05:02,200 --> 00:05:04,280 muốn ghi vào. 89 00:05:04,280 --> 00:05:08,670 Vì vậy, bây giờ mà chúng tôi đã thay đổi kích thước theo chiều ngang, và sau đó sử dụng đệm, 90 00:05:08,670 --> 00:05:12,030 hãy nhớ rằng bạn cần phải di chuyển tập tin của bạn chỉ báo vị trí, bởi vì bạn 91 00:05:12,030 --> 00:05:14,480 không thể fread vào đệm. 92 00:05:14,480 --> 00:05:18,230 Vì vậy, bạn muốn chắc chắn rằng tập tin của bạn chỉ số vị trí trong infile 93 00:05:18,230 --> 00:05:19,980 là tại thời điểm chính xác. 94 00:05:19,980 --> 00:05:23,970 Bởi vì chúng tôi cũng muốn thay đổi kích thước theo chiều dọc. 95 00:05:23,970 --> 00:05:27,090 Chúng ta không thể kéo dài nó theo chiều ngang, bởi vì mỗi nhu cầu hàng 96 00:05:27,090 --> 00:05:30,370 được sao chép n lần. 97 00:05:30,370 --> 00:05:33,050 >> Bây giờ, có một số khác nhau cách để làm điều này. 98 00:05:33,050 --> 00:05:39,010 Vì vậy, một, chúng tôi có thể sử dụng một phương pháp viết lại, trong rằng chúng ta nhớ tất cả các điểm ảnh 99 00:05:39,010 --> 00:05:42,840 của một hàng được đưa ra trong một mảng, và sau đó chúng tôi viết mảng như 100 00:05:42,840 --> 00:05:44,730 nhiều lần khi cần thiết. 101 00:05:44,730 --> 00:05:49,530 Hoặc có phương pháp recopy nơi, sau khi đọc trong một hàng trong infile 102 00:05:49,530 --> 00:05:53,530 và sau đó viết rằng vào outfile, thêm đệm, chúng tôi fseek 103 00:05:53,530 --> 00:05:57,250 sao cho sự bắt đầu của hàng ban đầu, và sau đó lặp lại ngang 104 00:05:57,250 --> 00:05:58,710 thay đổi kích thước từ đó. 105 00:05:58,710 --> 00:06:02,280 Không phân biệt của phương pháp này, tuy nhiên, bạn sẽ muốn mỗi điểm ảnh được lặp đi lặp lại 106 00:06:02,280 --> 00:06:06,370 n lần, và mỗi hàng là lặp đi lặp lại n lần là tốt. 107 00:06:06,370 --> 00:06:09,160 >> Cùng với đó, bạn sẽ có bitmap lớn hơn cuộc sống. 108 00:06:09,160 --> 00:06:11,760 Tên tôi là Zamyla, và đây là CS50. 109 00:06:11,760 --> 00:06:19,542