[音樂播放] 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。