1 00:00:00,000 --> 00:00:10,210 >> [音乐播放] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA陈:让我们一击 事情并调整其大小。 3 00:00:13,320 --> 00:00:17,710 在调整大小时,用户​​将通过在通过 在命令行中,位图图像的 4 00:00:17,710 --> 00:00:21,860 他们希望你扩展一个数字 他们还传递, 5 00:00:21,860 --> 00:00:23,770 在命令行中。 6 00:00:23,770 --> 00:00:24,690 我们怎么做呢? 7 00:00:24,690 --> 00:00:28,270 >> 嗯,首先第一件事情,让我们 打破这种分解成步骤。 8 00:00:28,270 --> 00:00:31,510 你将要打开的INFILE 他们给你,以及 9 00:00:31,510 --> 00:00:35,560 创建并打开输出文件的 你要放 10 00:00:35,560 --> 00:00:38,020 调整后的影像英寸 11 00:00:38,020 --> 00:00:42,050 然后,因为你调整大小和 因为它是一个位图,它一个头,所以 12 00:00:42,050 --> 00:00:46,080 你要同时更新标题 信息的输出文件, 13 00:00:46,080 --> 00:00:47,950 并编写英寸 14 00:00:47,950 --> 00:00:51,850 然后,你要读入 infile中的扫描线, 15 00:00:51,850 --> 00:00:56,890 逐像素,水平缩放 和写入这些像素进 16 00:00:56,890 --> 00:01:00,910 输出文件,指定 通过用户的规模。 17 00:01:00,910 --> 00:01:03,940 >> 你要记住, 添加填充物是必要的。 18 00:01:03,940 --> 00:01:05,400 更多的后来。 19 00:01:05,400 --> 00:01:07,790 然后,还调整垂直。 20 00:01:07,790 --> 00:01:08,890 确定。 21 00:01:08,890 --> 00:01:13,280 因此,这将是多一点点 复杂得多,做到了谁,但 22 00:01:13,280 --> 00:01:18,310 什么是相似的是,copy.c会, 再次,证明是非常有用的。 23 00:01:18,310 --> 00:01:23,160 请记住,copy.c打开一个文件, 更新了的头信息 24 00:01:23,160 --> 00:01:28,250 输出文件,然后读入扫描线, 逐个像素,写入每个像素 25 00:01:28,250 --> 00:01:30,510 到输出文件中的扫描线。 26 00:01:30,510 --> 00:01:37,040 >> 所以,再一次,你的第一个步骤可能可能 是CP,copy.c,resize.c 27 00:01:37,040 --> 00:01:40,560 到PSET5目录。 28 00:01:40,560 --> 00:01:43,920 但请记住,您复制它之前, 确保你了解 29 00:01:43,920 --> 00:01:46,600 copy.c得很彻底。 30 00:01:46,600 --> 00:01:47,620 确定。 31 00:01:47,620 --> 00:01:49,880 >> 因此,让我们打开一个文件。 32 00:01:49,880 --> 00:01:50,870 你知道该怎么做。 33 00:01:50,870 --> 00:01:52,600 我要离开这个给你。 34 00:01:52,600 --> 00:01:56,050 接着,更新的标题信息 为输出文件。 35 00:01:56,050 --> 00:01:59,240 因为我们有一个新的位图, 我们有新的头信息。 36 00:01:59,240 --> 00:02:00,970 什么改变吗? 37 00:02:00,970 --> 00:02:06,000 好了,文件的大小都不会改变 因为我们将有更多的 38 00:02:06,000 --> 00:02:07,900 像素比以前。 39 00:02:07,900 --> 00:02:11,060 图像尺寸为,因此,也 要改变,因为是 40 00:02:11,060 --> 00:02:13,050 宽度和高度。 41 00:02:13,050 --> 00:02:17,180 >> 那么哪些变量是那些,到底是什么? 42 00:02:17,180 --> 00:02:20,960 好吧,如果你直视头 信息,你看到有 43 00:02:20,960 --> 00:02:25,640 成员biSizeImage,它代表总 以字节为单位的图像的大小, 44 00:02:25,640 --> 00:02:28,340 包括像素和填充。 45 00:02:28,340 --> 00:02:32,520 biWidth是图像的宽度 以像素为单位减去填充。 46 00:02:32,520 --> 00:02:35,580 biHeight是高度 图像中的像素。 47 00:02:35,580 --> 00:02:39,200 等等这些都包含在 结构BITMAPFILEHEADER和 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER。 49 00:02:40,390 --> 00:02:45,300 你可以分辨出哪一个是由 要在bmp.h和看 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER结构和看 其中的变量被列在那里。 51 00:02:49,670 --> 00:02:54,700 >> 因此,要更新outfiles头 信息,你会想 52 00:02:54,700 --> 00:02:57,025 改变的那些价值观 高度和宽度。 53 00:02:57,025 --> 00:03:00,570 但机会是,你可能需要一些 的infile中的报头信息 54 00:03:00,570 --> 00:03:03,670 后来,所以最好是保持两者的轨道。 55 00:03:03,670 --> 00:03:07,770 但很清楚你的变量 名称,以便您不小心 56 00:03:07,770 --> 00:03:12,490 写在不正确的值 为输出文件的标头。 57 00:03:12,490 --> 00:03:16,160 >> 所以,现在让我们来读入 该扫描线的像素逐个像素。 58 00:03:16,160 --> 00:03:20,210 再次,我们要谈谈我们的信赖 文件I / O库,并期待在 59 00:03:20,210 --> 00:03:22,100 是fread函数。 60 00:03:22,100 --> 00:03:26,150 用fread接受一个指向结构的指针 将包含字节 61 00:03:26,150 --> 00:03:30,130 您正在阅读的,每一个的大小 元素,你正在阅读 - 62 00:03:30,130 --> 00:03:34,410 再次,的sizeof将是有用 这里起作用,对数 63 00:03:34,410 --> 00:03:38,820 的尺寸,大小的元素,你是 读取中,然后最终的 64 00:03:38,820 --> 00:03:41,310 inpointer,该文件是 您正在阅读的。 65 00:03:41,310 --> 00:03:46,770 所以,你正在做许多元素 从inpointer大小和 66 00:03:46,770 --> 00:03:49,040 把它们转换成数据。 67 00:03:49,040 --> 00:03:51,695 >> 现在,是时候调整水平。 68 00:03:51,695 --> 00:03:56,880 如果n等于2,则对每一个像素中 infile中,我们将它写 69 00:03:56,880 --> 00:04:00,870 两次在输出文件。 70 00:04:00,870 --> 00:04:02,210 我们如何写文件? 71 00:04:02,210 --> 00:04:06,400 那么,我们有fwrite函数,所以 我们已经采取了指针的struct 72 00:04:06,400 --> 00:04:10,170 包含你的字节 从编写,然后我们通过在 73 00:04:10,170 --> 00:04:14,430 大小,数量,以及输出端,其中 你将要编写。 74 00:04:14,430 --> 00:04:19,200 然后以重复的过程,将 能够简单迭代的for循环。 75 00:04:19,200 --> 00:04:21,740 >> 但我们需要记住 添加填充英寸 76 00:04:21,740 --> 00:04:26,040 填充的概念是,好了, 每个像素是3叮咬,但 77 00:04:26,040 --> 00:04:28,940 每个扫描线必须大小 是4字节的倍数。 78 00:04:28,940 --> 00:04:33,660 因此,如果象素的数目不是 4的倍数,我们需要添加一些 79 00:04:33,660 --> 00:04:36,630 填充,这仅仅是零。 80 00:04:36,630 --> 00:04:42,130 现在,不像做到了谁,而不像 副本,然后INFILE图像和 81 00:04:42,130 --> 00:04:44,370 输出文件的文件有不同的有 不同的填充,因为他们是 82 00:04:44,370 --> 00:04:46,360 不同的宽度。 83 00:04:46,360 --> 00:04:46,690 >> 确定。 84 00:04:46,690 --> 00:04:51,050 因此,也许一个公式会 在这里派上用场。 85 00:04:51,050 --> 00:04:55,120 我将它留给你找到它了,但 告诉你,写填充, 86 00:04:55,120 --> 00:04:59,360 好了,它只是一个简单的fputc函数, 通过在字符 87 00:04:59,360 --> 00:05:02,200 你想写点什么,然后 文件指针,你 88 00:05:02,200 --> 00:05:04,280 要写入。 89 00:05:04,280 --> 00:05:08,670 所以,现在我们已经水平调整大小, 然后使用填充, 90 00:05:08,670 --> 00:05:12,030 记住,你需要将你的文件 位置指示器,因为你 91 00:05:12,030 --> 00:05:14,480 不能用fread到填充。 92 00:05:14,480 --> 00:05:18,230 所以,你要确保你的文件 在INFILE位置指示器 93 00:05:18,230 --> 00:05:19,980 是在正确的点。 94 00:05:19,980 --> 00:05:23,970 因为我们也想 垂直调整大小。 95 00:05:23,970 --> 00:05:27,090 我们不能只是它舒展水平, 因为每一行的需求 96 00:05:27,090 --> 00:05:30,370 要复制n次。 97 00:05:30,370 --> 00:05:33,050 >> 目前,有几种不同的 方法可以做到这一点。 98 00:05:33,050 --> 00:05:39,010 因此,人们,我们可以使用一个重写的方法,在 我们记得所有的像素 99 00:05:39,010 --> 00:05:42,840 的一个给定行中的阵列,并且 那么我们该数组写入作为 100 00:05:42,840 --> 00:05:44,730 根据需要多次。 101 00:05:44,730 --> 00:05:49,530 或有重新复制方法,其中, 读一行在​​INFILE后 102 00:05:49,530 --> 00:05:53,530 然后编写到输出文件, 添加填充,我们FSEEK 103 00:05:53,530 --> 00:05:57,250 回到原来的行的开始, 然后重复水平 104 00:05:57,250 --> 00:05:58,710 从那里调整大小。 105 00:05:58,710 --> 00:06:02,280 不论采用何种方法,虽然,你会 要重复每一个像素 106 00:06:02,280 --> 00:06:06,370 n次,每排是 重复n次为好。 107 00:06:06,370 --> 00:06:09,160 >> 就这样,你就会有位图 比生命更大。 108 00:06:09,160 --> 00:06:11,760 我的名字是Zamyla,这是CS50。 109 00:06:11,760 --> 00:06:19,542