[音乐播放] ROB BOWDEN:你好,我是罗布,让我们 试试这个,看看尺寸。 因此,我们再次要开始 该copy.c的基本上是一个副本, 做一些修改。 请注意,我们立刻看到了变化,其中 而不是检查,以查看是否 ARGC不等于3,我们要检查 如果的argc不等于4,因为 现在我们不只​​是走在INFILE 和输出文件,但我们也正在采取的 n,它就是我们的量 通过缩放原始图像。 一旦我们确信这一点,我们只要 使用atoi的转换n到一个整数。 所以,现在我们要创造一些 别名,只需要调用的argv 2 INFILE和 argv的3 OUTFILE,因为argv的2和 argv的3不非常有帮助的名字。 现在,我们要检查,以确保n是 的范围内,我们预计,所以 规范规定,如果它小于或 等于零,或大于100,则 那么这是一个无效的大小调整的因素, 我们应该警告用户。 一旦我们超越了这一切,我们可以 终于打开我们INFILE,我们需要 错误检查以确保该 开放没有出于某种原因失败。 我们还需要打开我们的输出文件,并 再次错误检查,以确保 由于某种原因,没有失败。 不过可以肯定的,如果的开幕 输出文件失败,我们需要关闭 infile中,这是已经打开。 因此,假设没有失败,那么 方向走 - 就像在copy.c- - 要阅读的标头 从infile中。 我们要确保它是有效的 位图,但现在我们要做一些 事情有点不同。 因此,首先,我们要要 记得原来的宽度和高度 infile中的,因为我们要 要改变它的输出文件。 所以,现在记住,对于陌生的原因 bi.biheight,是负的,并 因此实际高度,以积极的,我们 要取绝对值。 现在,该填充将是相同的 计算因为它是在copy.c, 使用旧的宽度,而现在我们是 究竟要改 什么在我们的头。 所以我们要通过倍增我们的宽度 N,因为我们通过缩放宽度 N,用n乘以高度,因为我们是 用n缩放,而现在我们有 计算一个新的填充 基于新的宽度。 所以,现在我们需要改变一些 在我们的标题等领域。 Bi.biSizeImage被认为是本 在像素中的所有字节的大小 和图象的填补处理。 因此我们的单个行的大小 图像是RGB格式的三倍大小,大小 单个像素的,时间的数 在一行像素,加上所述填补在 该行的末尾。 然后我们要乘上 我们高度得到的绝对值 总字节数 中的图像数据。 bf.bfSize仅仅是总数 在我们的图像数据的字节,所以 bi.biSizeImage,加 我们的头的大小。 因此,增加对位图文件的大小 头和位图信息大小 头,确定。 所以这就是我们所需要 改变我们的头。 现在,我们将写入位图文件头 我们的输出文件,而我们的位图信息 包头到我们OUTFILE,现在 我们已经准备好开始准备 在实际的像素。 因此,我们要遍历 infile中的扫描线。 因此,我们要遍历oldheight。 这就是为什么我们需要记住的 原来的高度,才改变它 并用n缩放它。 现在,我们要读一个单一的 行infile中的成 缓冲区大小oldwidth的。 RGB的所以在这里,我们freading大小 三,一个像素,和老宽度 他们从INFILE到我们的缓冲区。 而这将是一个完整的 排在这个数组。 所以,现在,我们要迭代N次 打印此行我们的输出文件n次。 所以这就是这个循环在做什么。 这个内层循环遍历 行本身,该数组,印刷 数组n次中的每个像素。 这样第零个元素被打印 n次,第一个元素是 打印n次。 这就是那种怎么样,我们要 横向扩展的输出文件,并 这个循环,因为我们循环Ñ 次,是我们要如何 垂直刻度。 到这里,我们看到,我们需要添加 填充在每一行的末尾。 这就是为什么这个是for循环内 这是打印出n行的只是 此一行从infile中。 那么到这里,我将跳过 在infile中的填充,因为一旦 我们正与的一排做 INFILE,我们不关心 什么是填充了。 我们只是想要得到的第二行。 然后我们将环回,并尽 这再次用于第二行。 最后,当我们做完这些, 我们可以关闭INFILE,靠近 outfile中,并返回 0,因为我们就大功告成了。 我的名字是罗布,这是调整大小。 [音乐播放]