⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileconv.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					if (Lines.BitCount > 63)
					{
						tmpi = Lines.BitCount / 64 + 63;
						tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
						zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
						zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];

						memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
						Lines.ByteCursor += tmpk / 8;
						Lines.BitCursor = tmpk % 8;
					}
					tmpi = Lines.BitCount % 64;
					tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
					zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
					zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];
					memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
					Lines.ByteCursor += tmpk / 8;
					Lines.BitCursor = tmpk % 8;
					Lines.BitCount = 2;
				}
				TestBit >>= 1;
			}
		}
		
		tmpj = Lines.CurrentBit;
		if (Lines.BitCount > 63)
		{
			tmpi = Lines.BitCount / 64 + 63;
			tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
			zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
			zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];
			memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
			Lines.ByteCursor += tmpk / 8;
			Lines.BitCursor = tmpk % 8;
		}

		tmpi = Lines.BitCount % 64;
		tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
		zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
		zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];
		memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
		Lines.ByteCursor += tmpk / 8;
		Lines.BitCursor = tmpk % 8;
		if (Lines.BitCursor > 4) Lines.ByteCursor ++;
		zipCode.Lint = NewLineCode.Code[0];
		zipCode.Lint = (zipCode.Lint << 4) + Lines.LineBuffer[Lines.ByteCursor];
		memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 2);
		
		Lines.ByteCursor += 2;
		ByteCount += Lines.ByteCursor;
		fileFax.Write(Lines.LineBuffer,Lines.ByteCursor);

		ImageLength++;
		BmpFilePos-=LineBytes;
		BmpHeight--;
	}
	PageNumber=1;

	Ifd.IFDEntries[2].ValueOffset = ImageLength;
	Ifd.IFDEntries[8].ValueOffset = ImageLength;

	Ifd.IFDEntries[15].ValueOffset = PageNumber<<16;
	Ifd.IFDEntries[10].ValueOffset = ByteCount;
	
	fileFax.Seek(8L,CFile::begin);
	fileFax.Write(&Ifd.EntryCount,2);
	fileFax.Write(Ifd.IFDEntries,17*sizeof(IFDENTRY));

	fileFax.Close();
	fileBmp.Close();
	return TRUE;
	return TRUE;
}

BOOL TxtToFax(LPCTSTR TxtFileName, LPCTSTR FaxFileName,long Style) 
{
	if( !TxtFileName || !FaxFileName)
		return FALSE;

	STYLEINFO *pStyle=(STYLEINFO*)Style;
	if(!pStyle)
		pStyle=&Default_Style;

	int LeftMargin=(pStyle->nLeftMargin/8)*8;
	int RightMargin=pStyle->nRightMargin;
	int RowSpace=pStyle->nRowSpace;
	if(LeftMargin<0 ||RightMargin<0 ||RowSpace<0)
		return FALSE;

	TIFFHEADER TiffHeader;
	IFD Ifd;
	unsigned char buffer[200];
	unsigned long FileOffset = 0L;
	unsigned short i, l;
	unsigned short TestBit;
	unsigned short tmpi, tmpj, tmpk;
	LINESPEC Lines;
	ZIPCODE zipCode;
	unsigned long ImageLength=0;
	unsigned short PageNumber;
	unsigned long ByteCount;

	unsigned int LineBytes;
	CFile fileText,fileFax;
	char *fileBuf;
	int fileLength,filePos=0;
	char *BmpBuf;
	CDC scrDC,CompatibleDC;
	CFont font,* pOldFont;
	LOGFONT LogFont;
	CBitmap Bitmap;
	SIZE size;
	int CharWidth[256];
	int nWidth,nHeight;//一行文本的宽度和高度
	unsigned char  ImageBuffer[1728/8+1];

	if(!fileText.Open(TxtFileName,CFile::modeRead|CFile::shareDenyNone))
	{
		return FALSE;
	}
	
	if((fileLength=fileText.GetLength())==0)
	{
		fileText.Close();
		return FALSE;
	}
	
	fileBuf=(char *)::GlobalAlloc(GPTR,fileLength);
	if(fileBuf==NULL)
	{
		fileText.Close();
		return FALSE;  
	}
	
	fileText.Read(fileBuf,fileLength);
	fileText.Close();
	
	if(!fileFax.Open(FaxFileName,CFile::modeCreate|CFile::modeWrite))
	{
		::GlobalFree((HGLOBAL)fileBuf);		
		return FALSE;
	}
	
	if(!scrDC.CreateDC("display",NULL,NULL,NULL))
	{
		fileFax.Close();
		return FALSE;
	}

	CompatibleDC.CreateCompatibleDC(&scrDC);
	CompatibleDC.SetTextColor(RGB(255,255,255));
	CompatibleDC.SetBkColor(RGB(0,0,0));
	CompatibleDC.SetBkMode(0);
	
	int ScreenLogPixels = CompatibleDC.GetDeviceCaps(LOGPIXELSY);
	
	memset(&LogFont,0,sizeof(LOGFONT));
	strcpy(LogFont.lfFaceName,pStyle->szFontName);
	LogFont.lfHeight=-MulDiv(pStyle->FontSize,ScreenLogPixels, 72);
	LogFont.lfItalic=pStyle->bItalic?TRUE:FALSE;
	LogFont.lfWeight=pStyle->bBold?FW_BOLD:0;
	LogFont.lfUnderline=pStyle->bUnderline;
	
	int Index=pStyle->CharSet;
	if(Index>=sizeof(CharSet)/sizeof(int))
		Index=0;
	LogFont.lfCharSet=CharSet[Index];
	
	font.CreateFontIndirect(&LogFont);
	pOldFont = CompatibleDC.SelectObject(&font);
	
	CompatibleDC.GetCharWidth(0,255, CharWidth);
	GetTextExtentPoint(CompatibleDC.m_hDC,"人", 2, &size);
	
	nWidth=(1728-LeftMargin-RightMargin)/2;//一行文本的宽度
	if(nWidth<size.cx)
	{
		fileFax.Close();
		return FALSE;
	}

	nHeight=size.cy;//一行文本的高度
	
	Bitmap.CreateBitmap(nWidth,nHeight,1,1,NULL);
	CompatibleDC.SelectObject(&Bitmap);
	
	LineBytes=LineWidth(nWidth);
	BmpBuf=(char *)::GlobalAlloc(GPTR,LineBytes*(nHeight+1));
	if(BmpBuf==NULL)
	{
		fileFax.Close();
		return FALSE;
	}
	
	////////////////////////////////////////////////////////////////
	//    写头
	////////////////////////////////////////////////////////////////

	memset(&TiffHeader, 0, sizeof(TIFFHEADER));
	memset(&Ifd, 0, sizeof(IFD));
	TiffHeader.ByteOrder = II_ORDER;
	TiffHeader.TiffIdentify = TIFF_IDENTIFY;
	TiffHeader.IFDOffset = 8;
	Ifd.EntryCount = 17;
	fileFax.Write(&TiffHeader,sizeof(TIFFHEADER));
	Ifd.IFDEntries[0].Tag = NEW_SUBFILE_TYPE;
	Ifd.IFDEntries[0].Type = LONG_TYPE;
	Ifd.IFDEntries[0].Count = 1;
	Ifd.IFDEntries[0].ValueOffset = 2;
	Ifd.IFDEntries[1].Tag = IMAGE_WIDTH;
	Ifd.IFDEntries[1].Type = LONG_TYPE;
	Ifd.IFDEntries[1].Count = 1;
	Ifd.IFDEntries[1].ValueOffset = 1728;
	Ifd.IFDEntries[2].Tag = IMAGE_LENGTH;
	Ifd.IFDEntries[2].Type = LONG_TYPE;
	Ifd.IFDEntries[2].Count = 1;
	Ifd.IFDEntries[2].ValueOffset = ImageLength;
	Ifd.IFDEntries[3].Tag = BIT_SAMPLE;
	Ifd.IFDEntries[3].Type = SHORT_TYPE;
	Ifd.IFDEntries[3].Count = 1;
	Ifd.IFDEntries[3].ValueOffset = 1;
	Ifd.IFDEntries[4].Tag = COMPRESSION;
	Ifd.IFDEntries[4].Type = SHORT_TYPE;
	Ifd.IFDEntries[4].Count = 1;
	Ifd.IFDEntries[4].ValueOffset = 3;
	Ifd.IFDEntries[5].Tag = PHOTO_INTERPRET;
	Ifd.IFDEntries[5].Type = SHORT_TYPE;
	Ifd.IFDEntries[5].Count = 1;
	Ifd.IFDEntries[5].ValueOffset = 0;
	Ifd.IFDEntries[6].Tag = FILL_ORDER;
	Ifd.IFDEntries[6].Type = SHORT_TYPE;
	Ifd.IFDEntries[6].Count = 1;
	Ifd.IFDEntries[6].ValueOffset = 2;
	Ifd.IFDEntries[7].Tag = SAMPLE_PIXEL;
	Ifd.IFDEntries[7].Type = SHORT_TYPE;
	Ifd.IFDEntries[7].Count = 1;
	Ifd.IFDEntries[7].ValueOffset = 1;
	Ifd.IFDEntries[8].Tag = ROWS_STRIP;
	Ifd.IFDEntries[8].Type = LONG_TYPE;
	Ifd.IFDEntries[8].Count = 1;
	Ifd.IFDEntries[8].ValueOffset = ImageLength;
	Ifd.IFDEntries[9].Tag = X_RESOLUTION;
	Ifd.IFDEntries[9].Type = RATIONAL_TYPE;
	Ifd.IFDEntries[9].Count = 1;
	Ifd.IFDEntries[10].Tag = Y_RESOLUTION;
	Ifd.IFDEntries[10].Type = RATIONAL_TYPE;
	Ifd.IFDEntries[10].Count = 1;
	Ifd.IFDEntries[11].Tag = T4_OPTIONS;
	Ifd.IFDEntries[11].Type = LONG_TYPE;
	Ifd.IFDEntries[11].Count = 1;
	Ifd.IFDEntries[11].ValueOffset = 0;
	Ifd.IFDEntries[12].Tag = RESOLUTION_UNIT;
	Ifd.IFDEntries[12].Type = SHORT_TYPE;
	Ifd.IFDEntries[12].Count = 1;
	Ifd.IFDEntries[12].ValueOffset = 2;
	Ifd.IFDEntries[13].Tag = PAGE_NUMBER;
	Ifd.IFDEntries[13].Type = SHORT_TYPE;
	Ifd.IFDEntries[13].Count = 2;
	Ifd.IFDEntries[14].Tag = COPYRIGHT;
	Ifd.IFDEntries[14].Type = ASCII_TYPE;
	Ifd.IFDEntries[14].Count = 48;
	Ifd.IFDEntries[15].Tag = STRIP_OFFSETS;
	Ifd.IFDEntries[15].Type = LONG_TYPE;
	Ifd.IFDEntries[15].Count = 1;
	Ifd.IFDEntries[16].Tag = STRIP_BYTE_COUNTS;
	Ifd.IFDEntries[16].Type = LONG_TYPE;
	Ifd.IFDEntries[16].Count = 1;
	FileOffset = 8;

	Ifd.IFDEntries[9].ValueOffset = FileOffset + 6 + 17 * sizeof(IFDENTRY);
	Ifd.IFDEntries[10].ValueOffset = Ifd.IFDEntries[9].ValueOffset + 8;
	Ifd.IFDEntries[14].ValueOffset = Ifd.IFDEntries[10].ValueOffset + 8;
	Ifd.IFDEntries[15].ValueOffset = Ifd.IFDEntries[14].ValueOffset + 48;
	fileFax.Write(&Ifd.EntryCount,2);
	fileFax.Write(Ifd.IFDEntries,17*sizeof(IFDENTRY));
	Ifd.NextIFD = 0;
	fileFax.Write(&Ifd.NextIFD,4);
	memset(buffer, 0, 8);
	buffer[0] = 0xcc;
	buffer[4] = 0x01;
	fileFax.Write(buffer,8);
	buffer[0] = 0xcc / 2;
	fileFax.Write(buffer,8);
	strcpy((char *)&buffer[0], "Copyright, WangJian, 1996. All rights reserved.");
	fileFax.Write(buffer,48);
	buffer[0] = 0;
	buffer[1] = 0x80;
	fileFax.Write(buffer,2);
	ByteCount = 2;
	
	////////////////////////////////////////////////////////////////
	//    主循环
	////////////////////////////////////////////////////////////////
	while(filePos<fileLength)
	{
		//处理一行文本
		CompatibleDC.SelectObject(GetStockObject(BLACK_BRUSH));
		//CompatibleDC.SetBkMode(OPAQUE);
		CompatibleDC.PatBlt(0,0,nWidth,nHeight,PATCOPY);
		
		int nCnt=0;//字符记数
		int w=0;//累计宽度
		int beginPos=filePos;
		while(filePos<fileLength)
		{
			int oldPos=filePos;
			int oldCnt=nCnt;
			int byte=*(fileBuf+filePos) & 0xff;
			switch(byte)
			{
			case 13://换行
				filePos+=2;
				goto disp;
			case 10://忽略
				break;
			case 9:
				*(fileBuf+filePos)=' ';
				w+=CharWidth[32];
				break;
			default:
				if(byte>160)
				{
					w+=size.cx;
					filePos++;
					nCnt++;
				}
				else
				{
					w+=CharWidth[byte];
				}
			}//end of switch
			
			if(w>=nWidth)
			{
				//回滚
				nCnt=oldCnt;
				filePos=oldPos;
				//换行
				break;
			}
			
			nCnt++;
			filePos++;
		}
disp:
		//显示一行
		TextOut(CompatibleDC.m_hDC,0,0,fileBuf+beginPos,nCnt);

		BITMAPINFO BitmapInfo;
		memset(&BitmapInfo,0,sizeof(BitmapInfo));
		BitmapInfo.bmiHeader.biSize=        sizeof(BITMAPINFOHEADER);
		BitmapInfo.bmiHeader.biWidth=       nWidth;
		BitmapInfo.bmiHeader.biHeight=      nHeight;
		BitmapInfo.bmiHeader.biPlanes=      1;
		BitmapInfo.bmiHeader.biBitCount=    1;
		BitmapInfo.bmiHeader.biCompression= BI_RGB;
		BitmapInfo.bmiHeader.biSizeImage=   LineBytes;
		int nDummy=::GetDIBits(CompatibleDC.m_hDC,(HBITMAP)Bitmap,
			0,nHeight,BmpBuf,&BitmapInfo,DIB_PAL_COLORS);

		//写到FAX文件中去
		char *s=BmpBuf+LineBytes*(nHeight-1);
		for(int h=0;h<nHeight;h++)
		{
			memset(&Lines, 0, sizeof(LINESPEC));
			memset(ImageBuffer, 0, 1728/8/2);
			memmove(&ImageBuffer[LeftMargin/8*2],s,LineBytes);
			//压缩一行
			for(i=0;i<1728/8/2;i++)
			{
				TestBit = 0x80;
				for (l = 0; l < 8; l ++)
				{
					if(Lines.CurrentBit == ((ImageBuffer[i] & TestBit)>0))
					{
						Lines.BitCount += 2;
					}
					else
					{
						if (Lines.CurrentBit)
						{
							tmpj = 1;
							Lines.CurrentBit = 0;
						}
						else
						{
							tmpj = 0;
							Lines.CurrentBit = 1;
						}				

						if (Lines.BitCount > 63)
						{
							tmpi = Lines.BitCount / 64 + 63;
							tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
							zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
							zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];

							memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
							Lines.ByteCursor += tmpk / 8;
							Lines.BitCursor = tmpk % 8;
						}
						tmpi = Lines.BitCount % 64;
						tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
						zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
						zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];
						memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
						Lines.ByteCursor += tmpk / 8;
						Lines.BitCursor = tmpk % 8;
						Lines.BitCount = 2;
					}
					TestBit >>= 1;
				}
			}
			
			tmpj = Lines.CurrentBit;
			if (Lines.BitCount > 63)
			{
				tmpi = Lines.BitCount / 64 + 63;
				tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
				zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
				zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];
				memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
				Lines.ByteCursor += tmpk / 8;
				Lines.BitCursor = tmpk % 8;
			}

			tmpi = Lines.BitCount % 64;
			tmpk = Lines.BitCursor + HuffmanCode[tmpi].Length[tmpj];
			zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
			zipCode.Lint = (zipCode.Lint << Lines.BitCursor) + Lines.LineBuffer[Lines.ByteCursor];
			memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 4);
			Lines.ByteCursor += tmpk / 8;
			Lines.BitCursor = tmpk % 8;
			if (Lines.BitCursor > 4) Lines.ByteCursor ++;
			zipCode.Lint = NewLineCode.Code[0];
			zipCode.Lint = (zipCode.Lint << 4) + Lines.LineBuffer[Lines.ByteCursor];
			memcpy(&Lines.LineBuffer[Lines.ByteCursor], zipCode.Byte, 2);
			
			Lines.ByteCursor += 2;
			ByteCount += Lines.ByteCursor;
			fileFax.Write(Lines.LineBuffer,Lines.ByteCursor);
			s-=LineBytes;
		}

		for (l = 0; l < RowSpace; l++)
		{
			fileFax.Write(BlankLine,sizeof(BlankLine));
			ByteCount += 4;
		}
		ImageLength+=RowSpace+nHeight;
	}

	PageNumber=1;

	Ifd.IFDEntries[2].ValueOffset = ImageLength;
	Ifd.IFDEntries[8].ValueOffset = ImageLength;

	Ifd.IFDEntries[13].ValueOffset = PageNumber<<16;
	Ifd.IFDEntries[16].ValueOffset = ByteCount;

	fileFax.Seek(8L,CFile::begin);
	fileFax.Write(&Ifd.EntryCount,2);
	fileFax.Write(Ifd.IFDEntries,17*sizeof(IFDENTRY));

	Bitmap.DeleteObject();
	CompatibleDC.SelectObject(pOldFont);
	font.DeleteObject();
	CompatibleDC.DeleteDC();
	scrDC.DeleteDC();

	::GlobalFree((HGLOBAL)BmpBuf);
	::GlobalFree((HGLOBAL)fileBuf);
	fileFax.Close();
//	return TRUE;

	return TRUE;
}

BOOL FaxToBMP(LPCTSTR FaxFileName, LPCTSTR BMPFileName) 
{
	return FALSE;
}

short int TextToTiff (const char * inputfile, const char * outputfile, unsigned short resolution)
{


	FILE                   * TextFile, * TiffFile;
	unsigned long            FileOffset = 0L;
	unsigned short           PageNumber = 0, LineNumber = 0;
	unsigned short           wbuffer[16];
	char            buffer[100];

	FILE                   * FontFile;
	unsigned short           ImageLength, RowSpace = 3;
	unsigned long            ByteCount;
	unsigned short           TestBit;
	unsigned char            TextBuffer[108];
	unsigned short           i, j, l;
	unsigned short           tmpi, tmpj, tmpk;
	LINESPEC1                 Lines[16];
	ZIPCODE                  zipCode;

	TIFFHEADER1               TiffHeader;
	IFD1                     Ifd;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -