tif格式图像文件初探

上传人:第*** 文档编号:34252542 上传时间:2018-02-22 格式:DOC 页数:10 大小:72.50KB
返回 下载 相关 举报
tif格式图像文件初探_第1页
第1页 / 共10页
tif格式图像文件初探_第2页
第2页 / 共10页
tif格式图像文件初探_第3页
第3页 / 共10页
tif格式图像文件初探_第4页
第4页 / 共10页
tif格式图像文件初探_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《tif格式图像文件初探》由会员分享,可在线阅读,更多相关《tif格式图像文件初探(10页珍藏版)》请在金锄头文库上搜索。

1、TIF 格式图像文件初探初学乍练 1TIF 格 式 图 像 文 件 初 探作 者 : 三 辰 卡 通 集 团 技 术 部 刘 晖下 载 源 代 码一 、 前 言TIF 是 可 扩 充 标 记 的 文 件 , 所 以 理 论 上 是 不 可 能 编 写 一 个 能 识 别 所 有 类 别TIF 格 式 的 读 写 程 序 , 这 里 只 是 给 大 家 提 供 一 个 思 路 , 将 TIF 图 像 转 换 成 BMP图 像 后 就 可 以 使 用 Windows 提 供 的 API 函 数 对 其 进 行 编 辑 并 方 便 直 观 地 显 示 出 来 ,测 试 代 码 中 包 含 了 一 个

2、 用 于 测 试 的 TIF 图 。 本 代 码 也 只 能 针 对 这 一 种 类 别 的TIF 图 进 行 操 作 , 如 何 对 其 他 类 别 的 TIF 图 进 行 编 码 , 读 完 本 例 子 自 然 就 能 融 会 贯 通 了 。二 、 TIF 图 像 格 式 概 览TIF 图 由 四 个 部 分 组 成 :1、 图 像 文 件 头 ( Image File Header 简 称 IFH) :图 一 IFH 结 构 描 述IFH 数 据 结 构 包 含 3 个 成 员 共 计 8 个 字 节 , Byte order 成 员 可 能 是 “MM”(0x4d4d)或 “II”(0

3、x4949), 0x4d4d 表 示 该 TIFF 图 是 摩 托 罗 拉 整 数 格 式 0x4949表 示 该 图 是 Intel 整 数 格 式 ; Version 成 员 总 是 包 含 十 进 制 42(0x2a), 它 用 于 进一 步 校 验 该 文 件 是 否 为 TIF 格 式 , 42 这 个 数 并 不 是 一 般 人 想 象 中 的 那 样 认 为 是tif 软 件 的 版 本 , 实 际 上 , 42 这 个 数 大 概 永 远 不 会 变 化 ; 第 三 个 成 员 是 IFD( 接TIF 格式图像文件初探初学乍练 2下 来 要 说 的 第 二 个 数 据 结 构

4、) 相 对 文 件 开 始 处 的 偏 移 量 。 2、 图 像 文 件 目 录 ( Image File Directory 简 称 IFD) :图 二 IFD 及 DE 结 构 描 述IFD 是 TIF 图 中 最 重 要 的 数 据 结 构 , 它 包 含 了 一 个 TIF 文 件 中 最 重 要 的 信 息 ,一 个 TIF 图 可 能 有 多 个 IFD, 这 说 明 文 件 中 有 多 个 图 像 , 每 个 IFD 标 识 1 个 图像 的 基 本 属 性 。 IFD 结 构 中 包 含 了 三 类 成 员 , Directory Entry Count 指 出 该 结构 里

5、面 有 多 少 个 目 录 入 口 ; 接 下 来 就 是 N 个 线 性 排 列 的 DE 序 列 , 数 量 不 定 ( 这就 是 为 什 么 称 TIF 格 式 文 件 为 可 扩 充 标 记 的 文 件 , 甚 至 用 户 可 以 添 加 自 定 义 的 标记 属 性 ) , 每 个 DE 标 识 了 图 像 的 某 一 个 属 性 ; 最 后 就 是 一 个 偏 移 量 , 标 识 下一 个 文 件 目 录 相 对 于 文 件 开 始 处 的 位 置 , 当 然 , 如 果 该 TIF 文 件 只 包 含 了 一 幅 图像 , 那 么 就 只 有 一 个 IFD, 显 然 , 这 个

6、 偏 移 量 就 等 于 0; 3、 目 录 入 口 ( Directory Entry 简 称 DE) :共 12 个 字 节 , 见 图 二 。 简 单 说 , 一 个 DE 就 是 一 幅 图 像 的 某 一 个 属 性 。 例 如图 像 的 大 小 、 分 辨 率 、 是 否 压 缩 、 像 素 的 行 列 数 、 一 个 像 素 由 几 位 表 示 ( 1 位代 表 黑 白 两 色 , 8 位 代 表 256 色 等 等 ) 等 。 其 中 : tag 成 员 是 该 属 性 的 编 号 , 在图 像 文 件 目 录 中 , 它 是 按 照 升 序 排 列 的 。 我 们 可 以 通

7、 过 读 这 些 编 号 , 然 后 到TIF 格 式 官 方 白 皮 书 中 查 找 相 应 的 含 义 。 属 性 是 用 数 据 来 表 示 的 , 那 么 type 就TIF 格式图像文件初探初学乍练 3是 代 表 着 该 数 据 的 类 型 , TIF 官 方 指 定 的 有 5 种 数 据 类 型 。 type=1 就 是 BYTE类 型 ( 8 位 无 标 记 整 数 ) 、 type=2 是 ASCII 类 型 ( 7 位 ASCII 码 加 1 位 二 进 制0) 、 type=3 是 SHORT 类 型 ( 16 位 无 标 记 整 数 ) 、 type=4 是 LONG

8、类 型( 32 位 无 标 记 整 数 ) 、 type=5 是 RATIONAL 类 型 ( 2 个 LONG, 第 一 个 是 分 子 ,第 二 个 是 分 母 ) 。 length 成 员 是 数 据 的 数 量 而 不 是 数 据 类 型 的 长 度 。 第 4 个 成员 valueOffset 很 重 要 , 它 是 tag 标 识 的 属 性 代 表 的 变 量 值 相 对 文 件 开 始 处 的 偏 移量 。 如 果 变 量 值 占 用 的 空 间 小 于 4 个 字 节 , 那 么 该 值 就 存 放 在 valueOffset 中即 可 , 没 必 要 再 另 外 指 向 一

9、 个 地 方 了 。 4、 图 像 数 据 本 例 提 供 的 图 像 是 基 于 256 灰 度 级 的 , 即 一 个 字 节 代 表 一 个 像 素 点 ,它 是 0x000xff 区 间 中 256 个 灰 度 级 的 任 意 一 个 整 数 。 通 过 使 用 UltraEdit 工 具观 察 , 我 们 发 现 该 图 像 文 件 的 组 织 形 式 是 : IFH-数 据 -IFD。 以 下 的 示 例 说 明遵 循 了 这 一 观 察 结 果 。 三 、 实 战 1、 VC 创 建 一 个 MFC AppWizard(exe)工 程 取 名 TiffTest, 选 择 单 文

10、档 程 序 。 2、 添 加 TiffStruct.h 文 件 , 定 义 IFH 和 DE 结 构 ( 参 考 前 面 的 结 构 描 述 ) , 用 来接 收 读 TIF 文 件 的 信 息 。 #ifndef _TIFFSTRUCT_#define _TIFFSTRUCT_typedef struct tagIMAGEFILEHEADERWORD byteOrder;WORD version;DWORD offsetToIFD;IFH;typedef struct tagDIRECTORYENTRYWORD tag;WORD type;DWORD length;DWORD valueOf

11、fset;DE;TIF 格式图像文件初探初学乍练 4#endif3、 在 文 档 类 中 添 加 4 个 公 有 变 量 , 并 将 其 初 始 化 为 0。 在 TiffTestDoc.cpp 中#include TiffStruct.h DWORD m_dwBmSize; /图 象 的 数 据 部 分 的 大 小CPalette m_palDIB; /BMP 图 象 调 色 板HANDLE m_hDIB; /BMP 图 象 内 存 块 句 柄CSize m_sizeDoc; /图 象 的 长 和 宽4、 在 文 档 类 的 OnOpenDocument 函 数 中 定 义 局 部 工 具

12、变 量 并 读 文 件 DWORD dwFileLength = 0;CString strTemp = _T();WORD wDECount = 0;BYTE* pDIB = NULL;int i = 0;IFH ifh;ZeroMemory(CFile file;CFileException fe;if(0 = file.Open(lpszPathName, CFile:modeRead | CFile:shareDenyWrite, &fe)AfxMessageBox(打 开 文 件 失 败 );return FALSE;dwFileLength = file.GetLength();读

13、 IFH 文 件 头 if(sizeof(IFH) != file.Read(&ifh, sizeof(IFH)AfxMessageBox(读 TIF 文 件 头 失 败 );return FALSE;if(0x2a != ifh.version)AfxMessageBox(该 文 件 不 是 TIF 格 式 , 读 文 件 失 败 );return FALSE;TIF 格式图像文件初探初学乍练 5if(0x4949 != ifh.byteOrder)AfxMessageBox(该 TIF 文 件 不 是 IBMPC 字 节 序 , 读 文件 失 败 );return FALSE;file.S

14、eek(ifh.offsetToIFD, CFile:begin);/将 文 件 指 针 定位 到 IFD读 文 件 有 多 少 个 目 录 入 口 if(2 != file.Read(&wDECount, 2)AfxMessageBox(无 法 获 得 TIF 文 件 目 录 入 口 数 量 );return FALSE;strTemp.Format(该 TIF 文 件 有 %d 个 目 录 入 口 , wDECount);AfxMessageBox(strTemp);创 建 DE 数 组 , 接 收 信 息 , 数 组 中 有 wDECount 个 元 素 DE* pde = new DE

15、wDECount;DE* pTemp = pde;memset(pde, 0, sizeof(DE)*wDECount);if(sizeof(DE)*wDECount != file.ReadHuge(pde, sizeof(DE)*wDECount)AfxMessageBox(读 图 象 文 件 目 录 失 败 );delete pde;return FALSE;显 示 图 像 文 件 目 录 信 息 for(i=0; itag, i, pTemp-type, i, pTemp-length, i, pTemp-valueOffset);AfxMessageBox(strTemp);把 图

16、像 的 大 小 和 图 像 数 据 的 容 量 保 存 到 成 员 变 量 中 for(i=0; itag) /tag 为 256 的 目 录 入口 中 的 变 量 标 识 了 图 象 宽 度m_sizeDoc.cx = pTemp-valueOffset;if(257 = pTemp-tag) /图 象 高 度m_sizeDoc.cy = pTemp-valueOffset;if(273 = pTemp-tag) /计 算 图 象 数 据 占 用 字节 数/m_dwBmSize = pTemp-valueOffset - sizeof(IFH);/或 者 把 tag=256 的 valueOffset 乘 以tag=257 的 valueOffsetm_dwBmSize = m_sizeDoc.cx * m_sizeDoc.cy;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号