导航
  • 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

请教如何获取 *.tif 文件的(宽度、高度)属性

wf2091139 2006-04-12 10:09:55
用WIN32_FIND_DATA 只能获取一般文件常规属性 比如:创建日期、修改时间、文件大小等等。

如果我想取的一个 *.tif 图像文件的 宽度或高(单位是素或厘米)的属性值,请问该

如何操作?
...全文
670 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wf2091139 2006-04-22
......

真是奇怪了!我要谁给完整的代码了?

那个Class 我不知道,不可以问么?
回复
jishiping 2006-04-21
又些人真的奇怪,非得要将完整不动的代码给他才行。上面的CFile,不过也就是VC中的一个文件读写的class,难道楼主连文件读写也不会么?
回复
wf2091139 2006-04-20
没空上!有空的兄弟帮顶一下咯!
UP
回复
wf2091139 2006-04-15
但不知道该怎么做。
回复
wf2091139 2006-04-15

CFile file;
CFileException fe;

但是不是知道这两个怎么转换 :(
回复
jishiping 2006-04-15
上面不是有代码了么?不过上面的代码BIG ENDIAN格式的,只支持LITTLE ENDIAN格式的。
回复
BlueDeepOcean 2006-04-13
支持!跟进!
回复
jishiping 2006-04-13
如果只是读取宽和高,还是简单的。
回复
wf2091139 2006-04-13
UP
回复
zyyoung 2006-04-12
友情up
回复
wf2091139 2006-04-12
UP
回复
wf2091139 2006-04-12
下面一段是在网上找到的关于tif结构的描述:

  IFD是TIF图中最重要的数据结构,它包含了一个TIF文件中最重要的信息,一个TIF图可能有多个IFD,这说明文件中有多个图像,每个IFD标识1个图像的基本属性。 IFD结构中包含了三类成员,Directory Entry Count指出该结构里面有多少个目录入口;接下来就是N个线性排列的DE序列,数量不定(这就是 为什么称TIF格式文件为可扩充标记的文件,甚至用户可以添加自定义的标记属性),每个DE标识了图像的某一个属性;最后就是一个偏移量, 标识下一个文件目录相对于文件开始处的位置,当然,如果该TIF文件只包含了一幅图像,那么就只有一个IFD,显然,这个偏移量就等于0;

现在大致知道 当 标识 为256的 目录入口(DE)中的变量为图象的宽
当 标识 为257的 目录入口(DE)中的变量为图象的高

下面一段代码是VC实现TIF->BMP的源程序的一部分
对其中的一些类和方法不是很清楚。(高手们帮忙看看怎么转到bcb中 ^_^ )

(需要用到我在上面帖的那两个结构体)
....
....
2、添加TiffStruct.h文件,定义IFH和DE结构(参考前面的结构描述),用来接收读TIF文件的信息。
#ifndef _TIFFSTRUCT_
#define _TIFFSTRUCT_

typedef struct tagIMAGEFILEHEADER
{
WORD byteOrder;
WORD version;
DWORD offsetToIFD;
}IFH;

typedef struct tagDIRECTORYENTRY
{
WORD tag;
WORD type;
DWORD length;
DWORD valueOffset;
}DE;

#endif
3、在文档类中添加4个公有变量,并将其初始化为0。在TiffTestDoc.cpp中#include "TiffStruct.h"
DWORD m_dwBmSize; //图象的数据部分的大小
CPalette m_palDIB; //BMP图象调色板
HANDLE m_hDIB; //BMP图象内存块句柄
CSize m_sizeDoc; //图象的长和宽
4、在文档类的OnOpenDocument函数中定义局部工具变量并读文件
DWORD dwFileLength = 0;
CString strTemp = _T("");
WORD wDECount = 0;
BYTE* pDIB = NULL;
int i = 0;

IFH ifh;
ZeroMemory(&ifh, sizeof(IFH));

CFile file;
CFileException fe;

if(0 == file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
AfxMessageBox("打开文件失败");
return FALSE;
}
dwFileLength = file.GetLength();
//读IFH文件头
if(sizeof(IFH) != file.Read(&ifh, sizeof(IFH)))
{
AfxMessageBox("读TIF文件头失败");
return FALSE;
}

if(0x2a != ifh.version)
{
AfxMessageBox("该文件不是TIF格式,读文件失败");
return FALSE;
}

if(0x4949 != ifh.byteOrder)
{
AfxMessageBox("该TIF文件不是IBMPC字节序,读文件失败");
return FALSE;
}

file.Seek(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[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);
}
//把图像的大小和图像数据的容量保存到成员变量中
for(i=0; i<wDECount; i++)
{
pTemp = pde + i;
if(256 == pTemp->tag)//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的valueOffset
m_dwBmSize = m_sizeDoc.cx * m_sizeDoc.cy;
}
}
....
....
回复
wf2091139 2006-04-12
to:ccrun(老妖)
能详细点么?我不是很懂这个。

回复
jixingzhong 2006-04-12
tif 文件中应该也有类似 bmp 文件一样的信息头的吧 ...
我猜的,
没有看到这个方面的资料 ~

楼主可以解析 tif 文件的话,
只要分析一下文件总的信息就可以了 ~
回复
ccrun.com 2006-04-12
不用理会VC的那两个类,用API来搞就行。如CreateFile,SetFilePointer等。
回复
wf2091139 2006-04-12
此处只考虑一个tiff文件只有一个图象。

如我定义了2个结构 IFH 和 DE ,那怎么用它门来接受TIF文件的信息?

typedef struct tagimagefileheader
{
WORD byteorder;
WORD version;
DWORD offsettoifd
}IFH;

typedef struct tagdirectoryentry
{
WORD tag;
WORD type;
DWORD length;
DWORD valueoffset;
}DE;


----------------------
另:
看了一段VC代码 上面有两个变量定义;

CFile file;
CFileException fe;

不知道 CFile 和 CFileException 在bcb中对应是什么?
回复
wf2091139 2006-04-12
(我们右键一个 *.tif 文件 ,在他“属性”->“摘要”里面就可以看的到关于他的宽度和高度
的像素值。)
那究竟如何可以取到 tif 文件的这两个属性值?
回复
ccrun.com 2006-04-12
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是那么的复杂,但仍是一种最好的跨平台格式。因为它非常灵活,无论在视觉上还是其他方面,都能把任何图象编码成二进制形式而不丢失任何属性。
回复
wf2091139 2006-04-12
再次UP
回复
发动态
发帖子
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
社区公告
暂无公告