📄 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<m_wIFDNum;i++)
{
if(m_nByteOrderFlag!=0)
{
if(!m_pTifIFD[i].LoadIFD(hFile,1))
{
CloseHandle(hFile);
return FALSE;
}
}
else
{
if(!m_pTifIFD[i].LoadIFD(hFile,0))
{
CloseHandle(hFile);
return FALSE;
}
}
HDIB hIFDDib = m_pTifIFD[i].UnpackAsDib();
m_DibList[i].Attach(hIFDDib);
}
CloseHandle(hFile);
return TRUE;
}
void CTif::FreeMem()
{
WORD i;
if(m_DibList != NULL)
{
delete[] m_DibList;
m_DibList = NULL;
}
if(m_pTifIFD != NULL)
{
for(i=0;i<m_wIFDNum;i++)
m_pTifIFD[i].FreeMem();
delete[] m_pTifIFD;
m_pTifIFD = NULL;
m_wIFDNum=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -