[音乐播放] ZAMYLA陈:让我们一击 事情并调整其大小。 在调整大小时,用户​​将通过在通过 在命令行中,位图图像的 他们希望你扩展一个数字 他们还传递, 在命令行中。 我们怎么做呢? 嗯,首先第一件事情,让我们 打破这种分解成步骤。 你将要打开的INFILE 他们给你,以及 创建并打开输出文件的 你要放 调整后的影像英寸 然后,因为你调整大小和 因为它是一个位图,它一个头,所以 你要同时更新标题 信息的输出文件, 并编写英寸 然后,你要读入 infile中的扫描线, 逐像素,水平缩放 和写入这些像素进 输出文件,指定 通过用户的规模。 你要记住, 添加填充物是必要的。 更多的后来。 然后,还调整垂直。 确定。 因此,这将是多一点点 复杂得多,做到了谁,但 什么是相似的是,copy.c会, 再次,证明是非常有用的。 请记住,copy.c打开一个文件, 更新了的头信息 输出文件,然后读入扫描线, 逐个像素,写入每个像素 到输出文件中的扫描线。 所以,再一次,你的第一个步骤可能可能 是CP,copy.c,resize.c 到PSET5目录。 但请记住,您复制它之前, 确保你了解 copy.c得很彻底。 确定。 因此,让我们打开一个文件。 你知道该怎么做。 我要离开这个给你。 接着,更新的标题信息 为输出文件。 因为我们有一个新的位图, 我们有新的头信息。 什么改变吗? 好了,文件的大小都不会改变 因为我们将有更多的 像素比以前。 图像尺寸为,因此,也 要改变,因为是 宽度和高度。 那么哪些变量是那些,到底是什么? 好吧,如果你直视头 信息,你看到有 成员biSizeImage,它代表总 以字节为单位的图像的大小, 包括像素和填充。 biWidth是图像的宽度 以像素为单位减去填充。 biHeight是高度 图像中的像素。 等等这些都包含在 结构BITMAPFILEHEADER和 BITMAPINFOHEADER。 你可以分辨出哪一个是由 要在bmp.h和看 BITMAPINFOHEADER结构和看 其中的变量被列在那里。 因此,要更新outfiles头 信息,你会想 改变的那些价值观 高度和宽度。 但机会是,你可能需要一些 的infile中的报头信息 后来,所以最好是保持两者的轨道。 但很清楚你的变量 名称,以便您不小心 写在不正确的值 为输出文件的标头。 所以,现在让我们来读入 该扫描线的像素逐个像素。 再次,我们要谈谈我们的信赖 文件I / O库,并期待在 是fread函数。 用fread接受一个指向结构的指针 将包含字节 您正在阅读的,每一个的大小 元素,你正在阅读 - 再次,的sizeof将是有用 这里起作用,对数 的尺寸,大小的元素,你是 读取中,然后最终的 inpointer,该文件是 您正在阅读的。 所以,你正在做许多元素 从inpointer大小和 把它们转换成数据。 现在,是时候调整水平。 如果n等于2,则对每一个像素中 infile中,我们将它写 两次在输出文件。 我们如何写文件? 那么,我们有fwrite函数,所以 我们已经采取了指针的struct 包含你的字节 从编写,然后我们通过在 大小,数量,以及输出端,其中 你将要编写。 然后以重复的过程,将 能够简单迭代的for循环。 但我们需要记住 添加填充英寸 填充的概念是,好了, 每个像素是3叮咬,但 每个扫描线必须大小 是4字节的倍数。 因此,如果象素的数目不是 4的倍数,我们需要添加一些 填充,这仅仅是零。 现在,不像做到了谁,而不像 副本,然后INFILE图像和 输出文件的文件有不同的有 不同的填充,因为他们是 不同的宽度。 确定。 因此,也许一个公式会 在这里派上用场。 我将它留给你找到它了,但 告诉你,写填充, 好了,它只是一个简单的fputc函数, 通过在字符 你想写点什么,然后 文件指针,你 要写入。 所以,现在我们已经水平调整大小, 然后使用填充, 记住,你需要将你的文件 位置指示器,因为你 不能用fread到填充。 所以,你要确保你的文件 在INFILE位置指示器 是在正确的点。 因为我们也想 垂直调整大小。 我们不能只是它舒展水平, 因为每一行的需求 要复制n次。 目前,有几种不同的 方法可以做到这一点。 因此,人们,我们可以使用一个重写的方法,在 我们记得所有的像素 的一个给定行中的阵列,并且 那么我们该数组写入作为 根据需要多次。 或有重新复制方法,其中, 读一行在​​INFILE后 然后编写到输出文件, 添加填充,我们FSEEK 回到原来的行的开始, 然后重复水平 从那里调整大小。 不论采用何种方法,虽然,你会 要重复每一个像素 n次,每排是 重复n次为好。 就这样,你就会有位图 比生命更大。 我的名字是Zamyla,这是CS50。