位 圖 文 件 內 部 初 探



位 圖 文 件 內 部 初 探

    最 常 用 的 幾 種 圖 象 文 件 格 式 怎 樣 存 儲 圖 象 自 從 我 在 十 四 年 前 買 回 第 一 臺 pc 以 後, 我 就 一 直 對 計 算 機 用 1 和 0 組 成 的 數 據 流 來 存 儲 那 些 復 雜 的 信 息 很 感 興 趣。 最 初 引 起 我 注 意 的 是 當 時 曾 很 流 行 的 印 在 雜 志 上 的 basic 程 序 清 單, 它 們 帶 有 很 多 數 據 段, 你 可 將 它 們 鍵 入 並 運 行, 以 建 立 其 他 的 程 序。 從 這 裏 我 明 白 了 任 何 程 序 無 論 它 多 麼 復 雜, 也 只 不 過 是 一 系 列 的 針 對 計 算 機 微 處 理 器 的 指 令 而 已。 接 着, 我 對 ascii 碼 有 了 興 趣, 然 後 是 字 處 理 文 件 格 式, 再 後 來 嗎, 您 就 看 到 了 圖 象。

    直 至 今 天 仍 讓 我 着 迷 的 一 種 技 術 是 位 圖 文 件 存 儲。 一 個 位 圖 存 儲 了 計 算 機 上 能 夠 再 現 一 幅 圖 象 所 需 的 信 息。 我 們 經 常 在 顯 示 器 上 看 到 圖 象, 例 如 一 幅 美 麗 的 日 落, 然 而 在 計 算 機 眼 裏 它 只 是 一 堆 0 和 1 的 組 合。 歸 根 結 底, 也 就 是 位 圖 文 件 裏 的 這 些 位 和 字 節 來 告 訴 計 算 機 這 幅 圖 象 中 每 個 象 素 該 是 什 麼 顏 色, 然 後 計 算 機 把 位 圖 中 的 顏 色 轉 化 成 與 它 的 顯 示 卡 兼 容 的 格 式, 最 後 輸 出 到 顯 示 器 上。

    這 個 過 程 中 有 趣 的 是 計 算 機 怎 樣 解 釋 位 圖 中 的 數 據, 位 圖 文 件 有 多 種 格 式, 每 種 格 式 都 有 自 己 的 方 法 對 象 素 數 據 編 碼 並 給 出 此 種 格 式 所 要 求 的 一 些 其 他 信 息, 之 所 以 windows 95 能 夠 讀 取 .bmp 文 件 而 不 能 讀 .gif 文 件, 就 是 因 爲 他 的 設 計 人 員 使 paint 程 序 能 夠 對 以 .bmp 格 式 存 儲 的 圖 象 數 據 進 行 解 碼, 而 不 是 .gif。

    到 這 裏。 您 一 定 很 想 知 道 一 個 位 圖 文 件 裏 究 竟 是 什 麼, 一 種 格 式 同 另 一 種 又 有 什 麼 不 同 ? 那 麼 就 讓 我 們 來 簡 單 地 看 看 在 pc 機 上 常 用 的 六 種 位 圖 文 件 格 式。 當 然 還 有 其 他 的 文 件 格 式, 例 如 對 於 矢 量 圖 形, 就 是 存 儲 一 些 再 現 圖 象 的 指 令 而 不 是 每 個 象 素 的 顏 色 數 據, 但 是 在 這 裏 討 論 的 這 六 種 位 圖 文 件 格 式 才 是 您 平 時 工 作 最 可 能 使 用 的。

  bmp 文 件

    bmp(bitmap 的 縮 寫) 文 件 格 式 是 windows 本 身 的 位 圖 文 件 格 式, 所 謂 本 身 是 指 windows 內 部 存 儲 位 圖 即 採 用 這 種 格 式。 一 個 .bmp 格 式 的 文 件 通 常 有 .bmp 的 擴 展 名, 但 有 一 些 是 以 .rle 爲 擴 展 名 的, rle 的 意 思 是 行 程 長 度 編 碼(run length encoding)。 這 樣 的 文 件 意 味 着 其 使 用 的 數 據 壓 縮 方 法 是 .bmp 格 式 文 件 支 持 的 兩 種 rle 方 法 中 的 一 種。

    bmp 文 件 可 用 每 象 素 1、 4、 8、 16 或 24 位 來 編 碼 顏 色 信 息, 這 個 位 數 稱 作 圖 象 的 顏 色 深 度, 它 決 定 了 圖 象 所 含 的 最 大 顏 色 數。 一 幅 1-bpp(位 每 象 素, bit per pixel) 的 圖 象 只 能 有 兩 種 顏 色。 而 一 幅 24-bpp 的 圖 象 可 以 有 超 過 16 兆 種 不 同 的 顏 色。

    下 一 頁 的 圖 說 明 了 一 個 典 型 .bmp 文 件 的 結 構。 它 是 以 256 色 也 就 是 8-bpp 爲 例 的, 文 件 被 分 成 四 個 主 要 的 部 分: 一 個 位 圖 文 件 頭, 一 個 位 圖 信 息 頭, 一 個 色 表 和 位 圖 數 據 本 身。 位 圖 文 件 頭 包 含 關 於 這 個 文 件 的 信 息。 如 從 哪 裏 開 始 是 位 圖 數 據 的 定 位 信 息, 位 圖 信 息 頭 含 有 關 於 這 幅 圖 象 的 信 息, 例 如 以 象 素 爲 單 位 的 寬 度 和 高 度。 色 表 中 有 圖 象 顏 色 的 rgb 值。 對 顯 示 卡 來 說, 如 果 它 不 能 一 次 顯 示 超 過 256 種 顏 色, 讀 取 和 顯 示 .bmp 文 件 的 程 序 能 夠 把 這 些 rgb 值 轉 換 到 顯 示 卡 的 調 色 板 來 產 生 準 確 的 顏 色。

    bmp 文 件 的 位 圖 數 據 格 式 依 賴 於 編 碼 每 個 象 素 顏 色 所 用 的 位 數。 對 於 一 個 256 色 的 圖 象 來 說, 每 個 象 素 佔 用 文 件 中 位 圖 數 據 部 分 的 一 個 字 節。 象 素 的 值 不 是 rgb 顏 色 值, 而 是 文 件 中 色 表 的 一 個 索 引。 所 以 在 色 表 中 如 果 第 一 個 r/g/b 值 是 255/0/0, 那 麼 象 素 值 爲 0 表 示 它 是 鮮 紅 色, 象 素 值 按 從 左 到 右 的 順 序 存 儲, 通 常 從 最 後 一 行 開 始。 所 以 在 一 個 256 色 的 文 件 中, 位 圖 數 據 中 第 一 個 字 節 就 是 圖 象 左 下 角 的 象 素 的 顏 色 索 引, 第 二 個 就 是 它 右 邊 的 那 個 象 素 的 顏 色 索 引。 如 果 位 圖 數 據 中 每 行 的 字 節 數 是 奇 數, 就 要 在 每 行 都 加 一 個 附 加 的 字 節 來 調 整 位 圖 數 據 邊 界 爲 16 位 的 整 數 倍。

    並 不 是 所 有 的 bmp 文 件 結 構 都 象 表 中 所 列 的 那 樣, 例 如 16 和 24-bpp, 文 件 就 沒 有 色 表, 象 素 值 直 接 表 示 rgb 值, 另 外 文 件 私 有 部 分 的 內 部 存 儲 格 式 也 是 可 以 變 化 的。 例 如, 在 16 和 256 色 .bmp 文 件 中 的 位 圖 數 據 採 用 rle 算 法 來 壓 縮, 這 種 算 法 用 顏 色 加 象 素 個 數 來 取 代 一 串 顏 色 相 同 的 序 列, 而 且, windows 還 支 持 os/2 下 的 .bmp 文 件, 盡 管 它 使 用 了 不 同 的 位 圖 信 息 頭 和 色 表 格 式。

    pcx 文 件

    .pcx 是 在 pc 上 成 爲 位 圖 文 件 存 儲 標 準 的 第 一 種 圖 象 文 件 格 式。 它 最 早 出 現 在 zsoft 公 司 的 paintbrush 軟 件 包 中, 在 80 年 代 早 期 授 權 給 微 軟 與 其 產 品 捆 綁 發 行, 而 後 轉 變 爲 microsoft paintbrush, 並 成 爲 windows 的 一 部 分。 雖 然 使 用 這 種 格 式 的 人 在 減 少, 但 這 種 帶 有 .pcx 擴 展 名 的 文 件 在 今 天 仍 是 十 分 常 見 的。

    pcx 文 件 分 爲 三 部 分, 依 次 爲: pcx 文 件 頭, 位 圖 數 據 和 一 個 可 選 的 色 表。 文 件 頭 長 達 128 個 字 節, 分 爲 幾 個 域, 包 括 圖 象 的 尺 寸 和 每 個 象 素 顏 色 的 編 碼 位 數。 位 圖 數 據 用 一 種 簡 單 的 rle 算 法 壓 縮, 最 後 的 可 選 色 表 有 256 個 rgb 值, pcx 格 式 最 初 是 爲 cga 和 ega 來 設 計 的, 後 來 經 過 修 改 也 支 持 vga 和 真 彩 色 顯 示 卡, 現 在 pcx 圖 象 可 以 用 1、 4、 8 或 24-bpp 來 對 顏 色 數 據 進 行 編 碼。

    tiff 文 件

    pcx 格 式 是 所 有 位 圖 文 件 格 式 中 最 簡 單 的, 而 tiff(tagged image file format) 則 是 最 難 的 一 種。

    tiff 文 件 含 有 .tif 的 擴 展 名。 它 以 8 字 節 長 的 圖 象 文 件 頭 開 始 (ifh), 這 個 文 件 頭 中 最 重 要 的 成 員 是 一 個 指 向 名 爲 圖 象 文 件 目 錄 (ifd) 的 數 據 結 構 的 指 針。 ifd 是 一 個 名 爲 標 記(tag) 的 用 於 區 分 一 個 或 多 個 可 變 長 度 數 據 塊 的 表, 標 記 中 含 有 關 於 圖 象 的 信 息。 tiff 文 件 格 式 定 義 70 多 種 不 同 類 型 的 標 記, 有 的 用 來 存 放 以 象 素 爲 單 位 的 圖 象 寬 度 和 高 度, 有 的 用 來 存 放 色 表 ( 如 果 需 要 的 話 ), 當 然 還 必 須 有 用 來 存 放 位 圖 數 據 的 標 記, 一 個 tiff 格 式 文 件 完 全 爲 它 的 標 記 所 決 定, 而 且 這 種 文 件 結 構 極 易 擴 展, 因 爲 你 要 附 加 一 些 特 徵 只 須 增 加 一 些 額 外 的 標 記。

    究 竟 是 什 麼 使 tiff 文 件 如 此 復 雜? 一 方 面, 要 寫 一 種 能 夠 識 別 所 用 不 同 標 記 的 軟 件 非 常 困 難。 大 多 數 tiff 的 閱 讀 程 序 只 能 識 別 一 部 分 標 記, 所 以 會 出 現 這 種 情 況: 有 時 一 個 應 用 程 序 創 建 的 tiff 文 件, 另 一 個 應 用 程 序 卻 不 能 使 用。 創 建 tiff 文 件 的 程 序 還 可 能 會 在 文 件 中 加 一 些 只 有 它 自 己 認 識 的 標 記, 雖 然 tiff 的 閱 讀 程 序 可 以 跳 過 那 些 它 們 不 認 得 的 標 記, 但 這 樣 做 總 是 有 可 能 影 響 到 圖 象 的 質 量。

    另 一 方 面, 一 個 tiff 文 件 可 以 包 含 多 個 圖 象, 每 個 圖 象 都 有 自 己 的 ifd 和 一 系 列 標 記。 tiff 文 件 中 的 位 圖 數 據 可 能 會 用 好 幾 種 方 法 來 壓 縮, 所 以 一 個 完 備 的 tiff 閱 讀 程 序 應 該 有 rle 解 壓 縮 程 序, lzw 解 壓 縮 程 序 和 其 他 一 些 算 法 的 解 壓 縮 程 序。 然 而 更 糟 的 是 使 用 lzw 的 解 碼 必 須 得 到 unisys 公 司 的 同 意, 且 通 常 是 需 要 付 版 稅 的。 所 以 即 使 是 一 些 相 當 不 錯 的 tiff 閱 讀 程 序 在 它 們 遇 到 lzw 算 法 壓 縮 的 圖 象 時 也 是 無 能 爲 力 的。

    盡 管 tiff 是 那 麼 的 復 雜, 但 仍 是 一 種 最 好 的 跨 平 臺 格 式。 因 爲 它 非 常 靈 活, 無 論 在 視 覺 上 還 是 其 他 方 面, 都 能 把 任 何 圖 象 編 碼 成 二 進 制 形 式 而 不 丟 失 任 何 屬 性。

    gif 文 件

    當 許 多 圖 象 方 面 的 權 威 一 想 到 lzw 的 時 候, 他 們 也 會 想 到 gif(graphics interchange format, 讀 作 jiff) 這 是 一 種 常 用 的 跨 平 臺 的 位 圖 文 件 格 式, 最 初 爲 compuserve 公 司 所 創。 gif 文 件 通 常 帶 有 .gif 的 擴 展 名, 而 且 在 compuseve 上 大 量 存 在。

    gif 文 件 的 結 構 取 決 於 它 屬 於 哪 一 個 版 本, 目 前 的 兩 種 版 本 分 別 是 gif87a 和 gif89a, 前 者 較 簡 單。 無 論 是 哪 個 版 本, 它 都 以 一 個 長 13 字 節 的 文 件 頭 開 始, 文 件 頭 中 包 含 判 定 此 文 件 是 gif 文 件 的 標 記、 版 本 號 和 其 他 的 一 些 信 息。 如 果 這 個 文 件 只 有 一 幅 圖 象, 文 件 頭 後 緊 跟 一 個 全 局 色 表 來 定 義 圖 象 中 的 顏 色。 如 果 含 有 多 幅 圖 象 (gif 和 tiff 格 式 一 樣, 允 許 在 一 個 文 件 裏 編 碼 多 個 圖 象 ), 那 麼 全 局 色 表 就 被 各 個 圖 象 自 帶 的 局 部 色 表 所 替 代。

    在 gif87a 文 件 中, 文 件 頭 和 全 局 色 表 之 後 是 圖 象, 它 可 能 會 是 頭 尾 相 接 的 一 串 圖 象 中 的 第 一 個, 每 個 圖 象 由 三 部 分 組 成, 一 個 10 字 節 長 的 圖 象 描 述, 一 個 可 選 的 局 部 色 表 和 位 圖 數 據。 爲 有 效 利 用 空 間, 位 圖 數 據 用 lzw 算 法 來 壓 縮。

    gif89a 結 構 與 此 類 似, 但 它 還 包 括 可 選 的 擴 展 塊 來 存 放 每 個 圖 象 的 附 加 信 息。 gif89a 詳 細 定 義 了 四 種 擴 展 塊: 圖 象 控 制 擴 展 塊, 它 用 來 描 述 圖 象 怎 樣 被 顯 示 ( 例 如, 顯 示 是 應 該 象 一 個 透 明 物 去 覆 蓋 上 一 個 圖 象, 還 是 簡 單 的 替 換 它 ); 簡 單 文 本 擴 展 塊, 它 包 含 顯 示 在 圖 象 中 的 文 本; 注 釋 擴 展 塊, 它 以 ascii 文 本 形 式 存 放 注 釋 ; 應 用 擴 展 塊, 它 存 放 生 成 該 文 件 的 應 用 程 序 的 私 有 數 據。 這 些 擴 展 塊 可 以 出 現 在 文 件 中 全 局 色 表 的 任 何 地 方。

    gif 最 顯 著 的 優 點 是 它 的 廣 泛 使 用 和 它 的 緊 密 性。 但 它 有 兩 個 弱 點, 一 個 是 用 gif 格 式 存 放 的 文 件 最 多 只 能 含 有 256 種 顏 色。 另 一 個 可 能 更 重 要, 就 是 那 些 使 用 了 gif 格 式 的 軟 件 開 發 者 必 須 徵 得 compuserve 的 同 意, 他 們 每 賣 出 一 個 拷 貝 都 要 向 compuserve 付 版 稅。 這 個 政 策 是 compuserve 仿 效 unisys 公 司 作 出 的, 它 抑 制 了 那 些 程 序 員 在 他 的 圖 象 應 用 程 序 中 支 持 gif 文 件。

    png 文 件

    png(portable network graphic, 發 音 做 ping) 文 件 格 式 是 作 爲 gif 的 替 代 品 開 發 的, 它 能 夠 避 免 使 用 gif 文 件 所 遇 到 的 常 見 問 題。 它 從 gif 那 裏 繼 承 了 許 多 特 徵, 而 且 支 持 真 彩 色 圖 象。 更 重 要 的 是, 在 壓 縮 位 圖 數 據 時 它 採 用 了 一 種 頗 受 好 評 的 lz77 算 法 的 一 個 變 種, lz77 則 是 lzw 的 前 身, 而 且 可 以 免 費 使 用。 由 於 篇 幅 所 限, 在 這 裏 就 不 花 時 間 來 具 體 討 論 png 格 式 了。

    jpeg 文 件

    jpeg(joint photographic experts group, 發 音 做 jay-peg) 文 件 格 式 最 初 由 c-cube microsystems 推 出, 是 爲 了 提 供 一 種 存 儲 深 度 位 象 素 的 有 效 方 法, 例 如 對 於 照 片 掃 描, 顏 色 很 多 而 且 差 別 細 微 ( 有 時 也 不 細 微 )。 jpeg 和 這 裏 討 論 的 其 他 格 式 的 最 大 區 別 是 jpeg 使 用 一 種 有 損 壓 縮 算 法, 無 損 壓 縮 算 法 能 在 解 壓 後 準 確 再 現 壓 縮 前 的 圖 象, 而 有 損 壓 縮 則 犧 牲 了 一 部 分 的 圖 象 數 據 來 達 到 較 高 的 壓 縮 率。 但 是 這 種 損 失 很 小 以 至 於 人 們 很 難 察 覺。

    jpeg 圖 象 壓 縮 是 一 個 復 雜 的 過 程, 經 常 需 要 專 門 的 硬 件 來 幫 助。 首 先 圖 象 以 象 素 爲 單 位 分 成 8*8 的 塊。 然 後, 每 個 塊 分 三 個 步 驟 被 壓 縮。 第 一 步 使 用 dct(discrete cosine transform) 離 散 餘 弦 變 換 把 8*8 的 象 素 矩 陣 變 成 8*8 的 頻 率(也 就 是 顏 色 改 變 的 速 度) 矩 陣。 第 二 步 對 頻 率 矩 陣 中 的 值 用 量 化 矩 陣 進 行 量 化, 濾 掉 那 些 總 體 上 對 圖 象 不 重 要 的 部 分。 第 三 步, 也 就 是 最 後 一 步, 對 量 化 後 的 頻 率 矩 陣 使 用 無 損 壓 縮。

    因 爲 被 量 化 後 的 頻 率 矩 陣 缺 了 許 多 高 頻 信 息, 通 常 能 被 壓 縮 到 一 半 甚 至 更 少。 無 損 壓 縮 一 般 根 本 不 能 壓 縮 真 正 的 照 片 圖 象, 所 以 50% 的 壓 縮 率 已 是 相 當 不 錯 了, 但 另 一 方 面, 無 損 壓 縮 能 把 一 些 圖 象 文 件 尺 寸 減 少 90%, 這 樣 的 圖 象 文 件 就 不 適 合 用 jpeg 來 壓 縮。

    jpeg 的 有 損 部 分 產 生 在 第 二 步, 量 化 矩 陣 的 值 越 高, 從 圖 象 中 丟 掉 的 信 息 就 越 多, 從 而 壓 縮 率 就 越 高, 可 是 同 時 圖 象 的 質 量 就 越 差。 在 jpeg 壓 縮 時 可 以 選 擇 一 個 量 化 因 子, 這 個 因 子 的 值 決 定 了 量 化 矩 陣 中 的 數 值。 理 想 的 量 化 因 子 要 在 壓 縮 率 和 圖 象 質 量 間 達 到 平 衡, 所 以 對 不 同 的 圖 象 要 選 擇 不 同 的 量 化 因 子, 通 常 要 經 過 若 幹 次 嘗 試 後 方 可 確 定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章