www.pudn.com > viewImage.rar > Tif.cpp


// Tif.cpp: implementation of the CTif class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Tif.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CTif::CTif() 
{ 
	m_nByteOrderFlag=0;	// default order is intel struct  
	m_pTifIFD=NULL; 
	m_DibList = NULL; 
	m_wIFDNum=0; 
} 
 
CTif::~CTif() 
{ 
	FreeMem(); 
} 
 
BOOL CTif::Load(LPCTSTR szFileName) 
{ 
	register WORD i; 
 
	DWORD dwNextIfd;  // if == 0x0000, ok 
 
	HANDLE hFile; 
	CRect r; 
	TiffHeader	tiffheader; 
	DWORD dwNumOfByteRead; 
	WORD wEntryCount; 
	WORD wIfdCount; 
 
	hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL, 
		OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
	if(hFile==INVALID_HANDLE_VALUE) 
		return FALSE; 
	 
	if((ReadFile(hFile,&tiffheader,sizeof(TiffHeader), 
		&dwNumOfByteRead,NULL))==0)  
	{ 
		CloseHandle(hFile); 
		return FALSE; 
	} 
 
	if(tiffheader.nOrderId==0x4D4D) // "MM" 
	{ 
		m_nByteOrderFlag=1; 
	} 
	else if(tiffheader.nOrderId==0x4949)  // "II" 
	{ 
		m_nByteOrderFlag = 0; 
	} 
	else  
	{ 
		CloseHandle(hFile); 
		return FALSE; 
	} 
	 
	if(tiffheader.nTiffId!=0x2A) 
	{ 
		reverse(&tiffheader.nTiffId,2); 
		if(tiffheader.nTiffId!=0x2A) 
		{ 
			CloseHandle(hFile); 
			return FALSE; 
		} 
	} 
 
	if(m_nByteOrderFlag!=0) // MM 
	{ 
		reverse(&tiffheader.lnFirstIfdOffset,4); 
	} 
	if(SetFilePointer(hFile,tiffheader.lnFirstIfdOffset, 
		NULL,FILE_BEGIN)==0xFFFFFFFF)  
	{ 
		CloseHandle(hFile); 
		return FALSE; 
	} 
	 
	 
	// --- 1: compute how many IFDs in this tiff file 
	wIfdCount=1; 
	 
	while(1) 
	{ 
		if((ReadFile(hFile,&wEntryCount,sizeof(WORD), 
			&dwNumOfByteRead,NULL))==0)  
		{ 
			CloseHandle(hFile); 
			return FALSE; 
		} 
 
		if(m_nByteOrderFlag!=0) 
		{ 
			reverse(&wEntryCount,2); 
		} 
		long DEL = sizeof(TIFFMARK); 
		if(SetFilePointer(hFile,wEntryCount*sizeof(TIFFMARK), 
			NULL,FILE_CURRENT)==0xFFFFFFFF) 
		{ 
			CloseHandle(hFile); 
			return FALSE; 
		} 
 
		if(ReadFile(hFile,&dwNextIfd,sizeof(DWORD), 
			&dwNumOfByteRead,NULL)==0) 
		{ 
			CloseHandle(hFile); 
			return FALSE; 
		} 
		if(dwNextIfd != 0) 
		{ 
			wIfdCount++; 
			if(m_nByteOrderFlag!=0) 
			{ 
				reverse(&dwNextIfd,4); 
			} 
			if(SetFilePointer(hFile,dwNextIfd, 
				NULL,FILE_BEGIN)==0xFFFFFFFF) 
			{ 
				CloseHandle(hFile); 
				return FALSE; 
			} 
		} 
		else 
			break; 
	} 
	 
	// --- 2: load every IFDs  
	FreeMem(); 
 
	m_wIFDNum=wIfdCount; 
	m_pTifIFD=new CTifIFD[m_wIFDNum]; 
 
	if(m_pTifIFD==0) 
	{ 
		CloseHandle(hFile); 
		return FALSE; 
	} 
 
	// begin read IFD 
	if(SetFilePointer(hFile,tiffheader.lnFirstIfdOffset, 
		NULL,FILE_BEGIN)==0xFFFFFFFF)  
	{ 
		CloseHandle(hFile); 
		return FALSE; 
	} 
 
	// create DIB 
	if (m_DibList != NULL) 
		delete[] m_DibList; 
 
	m_DibList = new CDib[m_wIFDNum]; 
 
	//Load all IFDs into memory. 
	for(i=0;i