亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tififd.cpp

?? 《精通 vc++ 圖像編程》的源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// TifIFD.cpp: implementation of the CTifIFD class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Huffman.h"
#include "TifIFD.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define DECODE_BUF_EXTEND_LEN		90000	// Old value is 6000

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTifIFD::CTifIFD()
{
	//Initial class members
	m_pEntry = NULL;
	m_image.lpImage = NULL;

	m_outImage.lpImage = NULL;
	m_outImage.lnCount = 0;	

	m_lOldVRes = 0;
	m_lOldHRes = 0;

	m_lnRow = 0;
}

CTifIFD::~CTifIFD()
{
	FreeMem();
}

//	---------------------------------------------------------------------------
//	Load one tiff page from file
//
BOOL CTifIFD::LoadIFD(HANDLE hFile, WORD wByteOrderFlag)
{
	register WORD i;
	WORD wEntryCount;
	DWORD dwNumOfByteRead;
	WORD wLastTag;

	//Initial values
	WORD wIfdError=0;

	short nCompression=1;
	long int lnPhotometricInterpretation=-1;
	long int lnHres=0;
	long int lnVres=0;
	long int lnRes[2];
	short int nOures=1;

	//free memory first.
	FreeMem();

	//Get EntryCount form file;
	if(ReadFile(hFile,&wEntryCount,sizeof(WORD),
		&dwNumOfByteRead,NULL)==0)
		return FALSE;

	//alloc memory for entry
	m_pEntry = new TIFFMARK[wEntryCount];
	if(m_pEntry == 0)
		return FALSE;
	
	wLastTag=0;	// init last tag

	//Initialize some value , add by zsxl
	m_image.wBitOrder = 1;
	m_image.wOptions = 4;	// what's the meaing of 4

	//end initialize
	//Read and process entries.
	for(i=0;i<wEntryCount;i++)
	{
		if(ReadFile(hFile,&m_pEntry[i],sizeof(TIFFMARK),
			&dwNumOfByteRead,NULL)==0)
			return FALSE;

		if(wByteOrderFlag!=0)  // "MM"
		{
			reverse(&m_pEntry[i].wTag,2);
			reverse(&m_pEntry[i].wType,2);
			reverse(&m_pEntry[i].dwCount,4);

			if (m_pEntry[i].wType==IFD_SHORT) 
				reverse(&m_pEntry[i].dwValue,2) ;
			if ((m_pEntry[i].wType==IFD_LONG)||
				(m_pEntry[i].wType==IFD_RATIONAL)) 
				reverse(&m_pEntry[i].dwValue,4) ;	
		}
		if (m_pEntry[i].wTag <= wLastTag)
		{
			wIfdError=1 ;
			break ;
		}
		wLastTag=m_pEntry[i].wTag;


		if (m_pEntry[i].dwCount==1)
		{
			//if (cpu_order=='M')
			if(wByteOrderFlag!=0)  // "MM"
			{
				if (m_pEntry[i].wType==IFD_BYTE) 
					m_pEntry[i].dwValue>>=24 ;
				else if (m_pEntry[i].wType==IFD_SHORT) 
					m_pEntry[i].dwValue>>=16 ;
			}
		}

		switch (m_pEntry[i].wTag)
		{
		case ImageWidth_tag:	// ImageWidth must be 864, there is no default
            m_image.wWidth=(unsigned short int)m_pEntry[i].dwValue;
			break;

		case ImageLength_tag:	// ImageLength must be strip size, there is no default
			m_image.wLength=(unsigned short int)m_pEntry[i].dwValue;
			break;

		case BitsPerSample_tag:	//  BitsPerSample must be 1, default is ok
			if ((unsigned short int)m_pEntry[i].dwValue!=1) 
				wIfdError=1 ;
			break;
		case Compression_tag:	// Compression must be 3 or 4 ,the default is no good 
			nCompression = (short int)m_pEntry[i].dwValue;
			break;
		case PhotometricInterpretation_tag:  /* PhotometricInterpretation must be 0 */
											/* there is no default */
			lnPhotometricInterpretation=(unsigned short int)m_pEntry[i].dwValue;
			break;

		case FillOrder_tag:		// FillOrder can be 1 or 2 , take what comes
			m_image.wBitOrder=(unsigned short)m_pEntry[i].dwValue;
			break;

		case StripOffsets_tag:		/* StripOffsets we need to know */
									/* there is no default */
			m_image.dwOffset=m_pEntry[i].dwValue;
			break;

		case SamplesPerPixel_tag:	/* SamplesPerPixel must be 1 */
                                       /* default is ok */
			if((unsigned short int)m_pEntry[i].dwValue!=1) 
				wIfdError=1 ;
			break ;

		case RowsPerStrip_tag:		/* RowsPerStrip must be single strip */
                                       /* default is ok */
			if (m_image.wLength<m_pEntry[i].dwValue) 
				wIfdError=1 ;
			break ;

		case StripByteCounts_tag:	/* Positive StripByteCounts we do need */
			if (m_pEntry[i].dwValue==0) 
				wIfdError=1;
			m_image.dwByteCount=m_pEntry[i].dwValue;
			break ;

		case XResolution_tag:	/* Xresolution pointer to rational */
			lnHres = m_pEntry[i].dwValue;
			break ;

		case YResolution_tag:	/* Yresolution pointer to rational */
			lnVres = m_pEntry[i].dwValue;
 			break ;

		case T4Options_tag:		/* T4Options OK */
								/* default is ok */
			m_image.wOptions= (unsigned short)m_pEntry[i].dwValue&1;
			break ;
		case PageNumber_tag:	/* PageNumber [0] */
								/* optional field */
			m_image.wPage= (unsigned short int)m_pEntry[i].dwValue;
			break ;

		default:	/* we don't care about any other tags */
			break ;
		}
	}
	m_lImgWidth = m_image.wWidth;
	m_lImgHeight = m_image.wLength;
	if ((ReadFile(hFile,&m_image.dwIfd,sizeof(DWORD),&dwNumOfByteRead,NULL))==0) 
		return FALSE;

	if(wByteOrderFlag!=0)  // "MM" 
		reverse(&m_image.dwIfd,4);
	
	if ((nCompression!=3)&&(nCompression!=4)) // not the fax 3 & 5 format
	{	// 1: uncompressed format, 2: huffman format, 3: & 4: fax tiff format
		wIfdError=1;
	}

	if (nCompression==4) 
		m_image.wOptions=2;	

	if (lnHres==0) 
	{
		wIfdError=1;
	}
	else
	{
		if(SetFilePointer(hFile,lnHres,NULL,FILE_BEGIN)==
			0xFFFFFFFF) 
			return FALSE;

		if((ReadFile(hFile,lnRes,4*2,&dwNumOfByteRead,NULL))==0) 
			return FALSE;

		if(wByteOrderFlag!=0)  // "MM" 
		{
			reverse(&lnRes[0],4) ;
			reverse(&lnRes[1],4) ;
		}
		if(lnRes[1] == 0)	// This is not a good method, just for error .tiff file
			lnHres = 200;
		else
			lnHres=(lnRes[0]/lnRes[1]);

		m_lHRes = lnHres;
	}

	if (lnVres==0) 
	{
		wIfdError=1 ;
	}
	else
	{
		if(SetFilePointer(hFile,lnVres,NULL,FILE_BEGIN)==
			0xFFFFFFFF) 
			return FALSE;

		if ((ReadFile(hFile,lnRes,4*2,&dwNumOfByteRead,NULL))==0) 
			return FALSE;

		if(wByteOrderFlag!=0)  // "MM" 
		{
			reverse(&lnRes[0],4) ;
			reverse(&lnRes[1],4) ;
		}
		if(lnRes[1] == 0)	// This is not a good method, just for error .tiff file
			lnVres = 200;
		else
			lnVres=(lnRes[0]/lnRes[1]);

		m_lVRes = lnVres;
	}

	//	check the error flag and set the image offset to 0 if we haven't
	//	an acceptable class F IFD

	if(wIfdError)
	{
		m_image.dwOffset=0;
		return  FALSE;
	}
	else
	{
		if(lnVres == 0)
			lnVres = 200;
		nOures = (short)(((float)lnHres/(float)lnVres)+0.5);
		if(nOures<2) 
			m_image.wOptions |= 0x80 ;
	}

	if (SetFilePointer(hFile,m_image.dwOffset,
		NULL,FILE_BEGIN)==0xFFFFFFFF)
	{
		m_image.dwByteCount=0;
		return FALSE;
	}
	else
	{
		m_image.lpImage = new BYTE[m_image.dwByteCount];
		if(m_image.lpImage==0)
			return FALSE;

		if((ReadFile(hFile,m_image.lpImage,m_image.dwByteCount,
			&dwNumOfByteRead,NULL))==0) 
			return FALSE;
	}

	if(m_image.dwIfd != 0)
	{
		if(SetFilePointer(hFile,m_image.dwIfd,
			NULL,FILE_BEGIN)==0xFFFFFFFF)
			return FALSE;
	}

	// used for reserve the old value
	m_lOldHRes = m_lHRes;
	m_lOldVRes = m_lVRes;

	return TRUE;
}
//	--------------------------------------------------------------------------- 
//
//
void CTifIFD::FreeMem()
{
	if(m_pEntry!=NULL)
	{
		delete[] m_pEntry;
		m_pEntry = NULL;
	}		
	if(m_image.lpImage != NULL)
	{
		delete m_image.lpImage;
		m_image.lpImage = NULL;
	}
	FreeOutImageMem();
}
// ----------------------------------------------------------------------------
// Free output image memory
//
void CTifIFD::FreeOutImageMem()
{
	if(m_outImage.lpImage != NULL)
	{
		delete m_outImage.lpImage;
		m_outImage.lpImage = NULL;

		m_outImage.wWidth=0;
		m_outImage.wLength=0;
		m_outImage.lnCount=0;
	}
}
// ----------------------------------------------------------------------------
//	Unpack a tiff page image, then make into a dib memory block
//
HDIB CTifIFD::UnpackAsDib()
{
	register int i,j;

	int lnDots_left = m_lImgWidth;	// fax width
	int lnCode = 0;
	int lnResync, lnA0, lnB1, lnB2, lnHorz_runs;
	
	BYTE bOctet, bRef_color, bThis_bit, bCoding_scheme=1;

	DEVPARMS device;
	NODE *tree= (NODE *)&gWTree;

	char* cpTwolines;
	char *cpRef_line ;
	char *cpTmp_line ;
	LPBYTE lpSrcBuf;

	DWORD dwByteCount;

	/* Preliminaries for the whole file - check for a valid fax image in
	file, initialize various components of our DEVPARMS structure.
	Initialize our Output device with a get_device call, and initialize
	our Output logic with a ProcessLine INIT call.  The we can begin the main
	loop for each image in the file */

	if(m_image.lpImage==NULL)
	{
		return NULL;
	}

	// restore the old value first
	m_lHRes = m_lOldHRes;
	m_lVRes = m_lOldVRes;
	m_image.wWidth = (WORD)m_lImgWidth;
	m_image.wLength = (WORD)m_lImgHeight;

	device.hFile = NULL;
	device.id =	DEVICE_MEMORY; 
	device.color = WHITE ;
	device.res = 1+(m_image.wOptions>>7) ;

	device.source_width = m_lImgWidth;	// fax width & length
	device.source_height = m_lImgHeight;
	device.total_lines = 1;
	device.dest_width = m_lImgWidth;	//	fax width
	device.dest_height = m_lImgHeight;	//	fax length

	if (! ProcessLine(&device,INIT)) 
		return NULL;
	
	// init decoding first
	if(! InitDecoding())
		return NULL;

	/* Preliminaries for each image in the file - fseek to the start of
	the image.  (If we can't we give it a zero length and ignore). If a
	2-D or a T.6 image, set up pointers to the reference line and the
	current line.  If a T.6 image (which has no initial EOL) set up our
	key variables to the right initial state.  If a T.4 image just set
	our resync flag, which forces us to ignore everything until the next
	EOL code */

	cpTwolines = new char[((m_lImgWidth+7)/8)*2];	// used for some condition

	if(m_image.wOptions&3)
	{
		memset (cpTwolines,0x00,((m_lImgWidth+7)/8)*2);
		cpRef_line= &cpTwolines[0] ;
		device.cur_line= &cpTwolines[(m_lImgWidth+7)/8] ;
	}
	else 
	{
		device.cur_line= NULL ;
	}

	// will not be used again
	delete cpTwolines;

	if(m_image.wOptions&2)
	{
		bCoding_scheme= 2 ;
		lnResync= 0 ;
		device.color= WHITE ;
		lnDots_left= m_lImgWidth;/*FAXWIDTH*/ ;
		tree= (NODE *)&gTwoTree ;
		lnHorz_runs= lnCode= 0 ;
		lnA0= (-1) ;
	}
	else 
	{
		lnResync= 1 ;
	}

	/* This is the main loop for processing an image - we have a double
	loop, with the outer executing for each byte (octet) in the image,
	and the inner executing 8 times for each octet and processing each
	bit in turn.  The only exits before a completed image are on
	physical end of file, on error if writing Output file, or on EOFB
	in a T.6 file. */

	lpSrcBuf=m_image.lpImage;
	dwByteCount=m_image.dwByteCount;

	for (;dwByteCount;dwByteCount--)
	{
		if ((device.id== U_TIFF)&&(device.hFile== NULL)) 
			break;

		bOctet=*lpSrcBuf++;	// get the source data
		if (m_image.wBitOrder==2) 
			bOctet=gBackward[bOctet];

		for(i=0; i<8;i++,bOctet<<= 1) // decode each bit
		{
			/* We have three checks for every bit in the file.  First we
            check for EOL in T.6 mode - there is no EOL marker, but we
            should have exactly the right number of dots decoded.
            There should be none left in the line.  If we pass the
            test we Output the line and reset our key variables */

			if((m_image.wOptions&2)&&(lnHorz_runs==0)&&(lnDots_left==0))
            {
				if(! ProcessLine(&device, OUREOL))
					return NULL;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区在线观看| 欧美午夜在线一二页| 婷婷六月综合亚洲| 亚洲电影在线免费观看| 亚洲女人****多毛耸耸8| 国产精品灌醉下药二区| 欧美经典三级视频一区二区三区| 精品国产精品网麻豆系列| 日韩精品一区二| 久久男人中文字幕资源站| 久久亚洲欧美国产精品乐播| 久久久噜噜噜久久人人看| 国产欧美综合色| 国产精品国产三级国产aⅴ原创| 中文字幕日本不卡| 亚洲午夜久久久| 免费在线成人网| 国产麻豆精品一区二区| 不卡高清视频专区| 日韩一卡二卡三卡国产欧美| 日韩欧美一区二区在线视频| 精品理论电影在线| 中文字幕一区二区在线播放| 一区二区成人在线视频| 久热成人在线视频| 成人毛片在线观看| 欧美精品三级在线观看| 日韩精品一区二区三区在线观看| 国产清纯在线一区二区www| 一区二区在线免费观看| 免费成人在线观看| 成人高清在线视频| 欧美精品久久99| 欧美国产日韩精品免费观看| 亚洲成人av在线电影| 国产乱人伦偷精品视频不卡| 91视频在线看| 精品国产1区2区3区| 一区二区三区四区不卡视频| 久久99久久99精品免视看婷婷| 成人av综合一区| 日韩一区二区在线观看视频| 国产精品嫩草影院av蜜臀| 日韩精品欧美成人高清一区二区| 国产mv日韩mv欧美| 欧美一卡二卡在线| 亚洲欧洲一区二区三区| 麻豆视频一区二区| 欧美视频一区在线观看| 亚洲国产精品精华液2区45| 无码av中文一区二区三区桃花岛| 国产sm精品调教视频网站| 日韩一区二区免费在线电影| 亚洲激情网站免费观看| 国产成人欧美日韩在线电影| 欧美日韩精品一区视频| 亚洲精品欧美综合四区| 成人爽a毛片一区二区免费| 91精品国产一区二区| 亚洲图片一区二区| 91麻豆国产在线观看| 中国av一区二区三区| 国产精品自拍在线| 久久综合五月天婷婷伊人| 日本亚洲三级在线| 欧美日韩国产精选| 亚洲自拍偷拍网站| 色综合天天狠狠| 亚洲天堂福利av| 99久久精品免费精品国产| 久久久精品中文字幕麻豆发布| 色综合久久综合中文综合网| 国产亚洲欧美日韩在线一区| 麻豆成人综合网| 91精品国产色综合久久ai换脸| 午夜av一区二区| 欧美精品电影在线播放| 亚洲午夜激情av| 欧美日精品一区视频| 亚洲靠逼com| 欧美影片第一页| 日韩中文字幕不卡| 日韩精品中文字幕一区二区三区| 蜜桃视频一区二区| 亚洲精品在线三区| 国产丶欧美丶日本不卡视频| 国产欧美日韩精品一区| 波多野结衣在线一区| 最近日韩中文字幕| 欧美日韩精品电影| 婷婷一区二区三区| 2021久久国产精品不只是精品| 紧缚奴在线一区二区三区| 久久亚洲一级片| 99精品黄色片免费大全| 一区二区三区电影在线播| 欧美日韩成人综合天天影院| 美女一区二区三区| 中文字幕精品一区二区精品绿巨人 | 欧美日韩黄色影视| 偷偷要91色婷婷| 久久夜色精品一区| 91猫先生在线| 蜜臀av国产精品久久久久| 欧美国产一区二区在线观看| 91官网在线观看| 麻豆成人av在线| 中文字幕亚洲视频| 日韩一区二区精品葵司在线 | 色屁屁一区二区| 日韩国产高清在线| 国产三级久久久| 欧美精品色综合| 97久久精品人人澡人人爽| 日本v片在线高清不卡在线观看| 久久精品男人天堂av| 欧美午夜精品久久久| 国产一区二区三区最好精华液| 亚洲日本在线a| 精品国产99国产精品| 在线精品国精品国产尤物884a| 精品一区二区三区在线观看| 亚洲精品视频观看| 久久先锋影音av鲁色资源网| 欧美最新大片在线看| 丰满白嫩尤物一区二区| 日本va欧美va瓶| 亚洲午夜免费视频| 亚洲日本在线a| 亚洲国产精品高清| 日韩精品一区二区三区视频| 在线精品观看国产| 99re6这里只有精品视频在线观看| 免费观看91视频大全| 亚洲成av人片一区二区三区 | 欧洲精品在线观看| 成人av午夜影院| 国产一区二区三区免费在线观看| 视频一区二区三区中文字幕| 亚洲综合免费观看高清完整版在线 | 欧美日韩大陆一区二区| 99精品偷自拍| 成人av综合一区| 成人性视频免费网站| 国产麻豆9l精品三级站| 男男gaygay亚洲| 蜜桃av一区二区三区电影| 天堂av在线一区| 偷拍一区二区三区四区| 午夜伦欧美伦电影理论片| 亚洲成人免费在线| 日韩黄色免费网站| 日韩av在线免费观看不卡| 亚洲成人综合网站| 日韩成人av影视| 久久狠狠亚洲综合| 国内精品伊人久久久久影院对白| 免费av网站大全久久| 久久se精品一区精品二区| 日韩av高清在线观看| 免费欧美在线视频| 国产九色sp调教91| 成人免费的视频| 91老师国产黑色丝袜在线| 在线观看亚洲一区| 欧美一三区三区四区免费在线看 | 91成人国产精品| 欧美手机在线视频| 4438成人网| 久久精品一区二区三区四区| 国产性色一区二区| 国产精品传媒入口麻豆| 亚洲一区二区精品久久av| 免费人成网站在线观看欧美高清| 九九精品一区二区| 成人精品鲁一区一区二区| 91视频国产观看| 日韩一区二区三区电影 | 中文字幕在线观看一区| 亚洲自拍另类综合| 久久精品国产**网站演员| www.在线成人| 日韩一区二区三区在线| 国产午夜久久久久| 亚洲国产综合在线| 久久国产夜色精品鲁鲁99| 99国产精品99久久久久久| 欧美一级片免费看| 中文字幕在线一区免费| 日韩中文字幕麻豆| www.在线欧美| 欧美不卡一区二区| 亚洲久草在线视频| 国产一区二区免费视频| 91国内精品野花午夜精品| 久久嫩草精品久久久精品一| 亚洲国产日日夜夜| 国产成a人无v码亚洲福利| 欧美美女一区二区三区| 国产精品丝袜91|