TIF格式图像文件初探
2009-10-27 20:31:22 来源:WEB开发网三、实战
1、VC创建一个MFC AppWizard(exe)工程取名TiffTest,选择单文档程序。
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;
}
}
在文档类中创建一个成员工具函数CreateBmpBuffer,申请全局内存块以存放BMP文件结构数据
BOOL CTiffTestDoc::CreateBmpBuffer()
{
//申请BMP内存块
m_hDIB = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) +
256*sizeof(RGBQUAD) +
m_dwBmSize);
if(NULL == m_hDIB)
{
AfxMessageBox("申请BMP内存块失败");
return FALSE;
}
else
{
return TRUE;
}
}
更多精彩
赞助商链接