您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:442 来源:vckbase.com

本文章共5190字,分4页,当前第2页,快速翻页:
 


三、实战

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;

		}

	}
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 下一页>>
相关文章

实现类似Excel和Visual C 里文件夹式样的标
动态真彩工具栏
C# 2.0匿名方法揭密
C QA 专栏:列表视图模式,SetForeground
MFC架构下的DirectX8
内存优化之道:托管代码的失传内存优化技术
推荐一个简单的托盘类
如何在C#应用程序和DLL中使用消息
连接 COM 与 .NET 的桥梁(三)——COM 服务
Windows 文件过滤驱动经验总结
子类化:增强Edit控件为日期输入控件
如何限制PC机上网
用VC轻松实现 ADO.net
ASP.NET 专栏:编写高性能 Web 应用程序的1
通用图像类算法扩充库
基于TCP的局域网多用户通信、文件传送程序详
通用权限管理模块的设计与实现
杂谈:人与软件
USB有关的编程
QQ界面的模拟实现(下)

相关评论


本文章所属分类:首页 VC++

  热门关键字: