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

📄 fileconv.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	if (resolution == HIGH_RESOLUTION)
	{
		ImageLength = 2310;
		RowSpace = 3;
	}
	else if (resolution == STANDARD_RESOLUTION)
	{
		ImageLength = 1122;
		RowSpace = 1;
	}
	else 
		return (6);

	FILE * fp;
	if (!(fp = fopen(inputfile, "r"))) 
		return (1);
	if (!(TextFile = fopen(inputfile, "r"))) 
	{
		fclose(fp);
		return (1);
	}
	if (!(TiffFile = fopen(outputfile, "wb+"))) 
	{
		fclose(fp);
		fclose(TextFile);
		return (2);
	}

	if (!(FontFile = fopen(".\\hzk16.dat", "rb")))
	{
		fclose(fp);
		fclose(TextFile);
		fclose(TiffFile);
		return (5);
	}

	memset(&TiffHeader, 0, sizeof(TIFFHEADER1));
	memset(&Ifd, 0, sizeof(IFD));
	TiffHeader.ByteOrder = II_ORDER;
	TiffHeader.TiffIdentify = TIFF_IDENTIFY;
	TiffHeader.IFDOffset = 8;
	Ifd.EntryCount = 17;
	Ifd.IFDEntries = (IFDENTRY1 *)malloc(17 * sizeof(IFDENTRY1));
	if (Ifd.IFDEntries == NULL)
	{
		fclose(fp);
		fclose(TextFile);
		fclose(TiffFile);
		fclose(FontFile);
		return (4);
	}
	for (i = 0; i < 16; i ++)
	{
		memset(&Lines[i], 0, sizeof(LINESPEC1));
		Lines[i].BitCount = 64;
		Lines[i].LineBuffer = (unsigned char *)malloc(432);
		if (Lines[i].LineBuffer == NULL)
		{
			fclose(fp);
			fclose(TextFile);
			fclose(TiffFile);
			fclose(FontFile);
			return (4);
		}
	}
	memset(Ifd.IFDEntries, 0, 17 * sizeof(IFDENTRY1));

	fwrite(&TiffHeader, sizeof(TIFFHEADER1), 1, TiffFile);

	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;

//以下为转换程序
	while (1)
	{
		char *p=(char *)&TextBuffer[0];
		memset(TextBuffer, 0, 108);
		p=(char *)&TextBuffer[0];
		char* ResdSuc=fgets(p, 100, TextFile);
		if (ResdSuc)
		{
			for (j = 0; j < 16; j ++) 
				memset(Lines[j].LineBuffer, 0, 432);
		
			if (LineNumber == 0)
			{
				Ifd.IFDEntries[9].ValueOffset = FileOffset + 6 + 17 * sizeof(IFDENTRY1);
				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;
				fwrite(&Ifd.EntryCount, 2, 1, TiffFile);
				fwrite(Ifd.IFDEntries, sizeof(IFDENTRY1), 17, TiffFile);
				Ifd.NextIFD = 0;
				fwrite(&Ifd.NextIFD, 4, 1, TiffFile);
				memset(buffer, 0, 8);
				buffer[0] = (char)0xcc;
				buffer[4] = 0x01;
				fwrite(buffer, 8, 1, TiffFile);
				buffer[0] = 0xcc / resolution;
				fwrite(buffer, 8, 1, TiffFile);
				strcpy(buffer, "Copyright, WangJian, 1996. All rights reserved.");
				fwrite(buffer, 48, 1, TiffFile);
				buffer[0] = 0;
				buffer[1] = (char)0x80;
				fwrite(buffer, 2, 1, TiffFile);
				ByteCount = 2;
			}

			int n=strlen(p);
			if(n>0)
			{
				unsigned char a=TextBuffer[n-1];
				if(a==0x0a ) TextBuffer[--n]=0;

				for(int k=0;k<n;k++)
				{
					a=TextBuffer[k];
					if(a>160)
					{
						if(k>=n-1)
						{
							ungetc(TextBuffer[k],TextFile);
							TextBuffer[k]=0;
							break;
						}
						if (TextBuffer[k+1]>160)
							k++;
					}
				}
			}

	//		TextBuffer[strlen(p) - 1] = 0;

			for (i = 0; i < 103; )
			{
				if (i >= strlen(p))
				{
					i = (104 - strlen(p)) * 16;
					for (j = 0; j < 16; j ++)
					{
						if (Lines[j].CurrentBit)
						{
							tmpj = 1;
							Lines[j].CurrentBit = 0;
							if (Lines[j].BitCount > 63)
							{
								tmpi = Lines[j].BitCount / 64 + 63;
								tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
								zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
								zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
								memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
								Lines[j].ByteCursor += tmpk / 8;
								Lines[j].BitCursor = tmpk % 8;
							}
							tmpi = Lines[j].BitCount % 64;
							tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
							zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
							zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
							memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
							Lines[j].ByteCursor += tmpk / 8;
							Lines[j].BitCursor = tmpk % 8;
							Lines[j].BitCount = i;
						}
						else
						{
							Lines[j].BitCount += i;
						}
					}
					i = 104;
					break;
				}
				if ((TextBuffer[i] > 0xa0) && ((i + 1) <(signed) strlen(p)) &&
					(TextBuffer[i + 1] > 0xa0))//处理汉字
				{
					fseek(FontFile, ((long)(TextBuffer[i] - 0xa1u) * 94 + (long)TextBuffer[i + 1] - 0xa1u) * 32, SEEK_SET);
					fread(wbuffer, 16, 2, FontFile);
					for (j = 0; j < 16; j ++)
					{
						TestBit = 0x0080;
						for (l = 0; l < 16; l ++)
						{
							if (!TestBit) TestBit = 0x8000;
							if (Lines[j].CurrentBit == ((wbuffer[j] & TestBit) > 0))
							{
								Lines[j].BitCount += 2;
							}
							else
							{
								if (Lines[j].CurrentBit)
								{
									tmpj = 1;
									Lines[j].CurrentBit = 0;
								}
								else
								{
									tmpj = 0;
									Lines[j].CurrentBit = 1;
								}
								if (Lines[j].BitCount > 63)
								{
									tmpi = Lines[j].BitCount / 64 + 63;
									tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
									zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
									zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
									memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
									Lines[j].ByteCursor += tmpk / 8;
									Lines[j].BitCursor = tmpk % 8;
								}
								tmpi = Lines[j].BitCount % 64;
								tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
								zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
								zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
								memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
								Lines[j].ByteCursor += tmpk / 8;
								Lines[j].BitCursor = tmpk % 8;
								Lines[j].BitCount = 2;
							}
							TestBit >>= 1;
						}
					}
					i = i + 2;
				}
				else if (TextBuffer[i] > 0x20 && TextBuffer[i] < 0x7f)
				{
					for (j = 0; j < 16; j ++)
					{
						TestBit = 0x80;
						for (l = 0; l < 8; l ++)
						{
							if (Lines[j].CurrentBit == ((ASCII[TextBuffer[i]][j] & TestBit) > 0))
							{
								Lines[j].BitCount += 2;
							}
							else
							{
								if (Lines[j].CurrentBit)
								{
									tmpj = 1;
									Lines[j].CurrentBit = 0;
								}
								else
								{
									tmpj = 0;
									Lines[j].CurrentBit = 1;
								}
								if (Lines[j].BitCount > 63)
								{
									tmpi = Lines[j].BitCount / 64 + 63;
									tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
									zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
									zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
									memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
									Lines[j].ByteCursor += tmpk / 8;
									Lines[j].BitCursor = tmpk % 8;
								}
								tmpi = Lines[j].BitCount % 64;
								tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
								zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
								zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
								memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
								Lines[j].ByteCursor += tmpk / 8;
								Lines[j].BitCursor = tmpk % 8;
								Lines[j].BitCount = 2;
							}
							TestBit >>= 1;
						}
					}
					i ++;
				}
				else
				{
					for (j = 0; j < 16; j ++)
					{
						if (Lines[j].CurrentBit)
						{
							tmpj = 1;
							Lines[j].CurrentBit = 0;
							if (Lines[j].BitCount > 63)
							{
								tmpi = Lines[j].BitCount / 64 + 63;
								tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
								zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
								zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
								memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
								Lines[j].ByteCursor += tmpk / 8;
								Lines[j].BitCursor = tmpk % 8;
							}
							tmpi = Lines[j].BitCount % 64;
							tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
							zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
							zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
							memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
							Lines[j].ByteCursor += tmpk / 8;
							Lines[j].BitCursor = tmpk % 8;
							Lines[j].BitCount = 16;
						}
						else
						{
							Lines[j].BitCount += 16;
						}
					}
					i ++;
				}
			}
			if (i == 103)
			{
				for (j = 0; j < 16; j ++)
				{
					if (Lines[j].CurrentBit)
					{
						tmpj = 1;
						Lines[j].CurrentBit = 0;
						if (Lines[j].BitCount > 63)
						{
							tmpi = Lines[j].BitCount / 64 + 63;
							tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
							zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
							zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
							memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
							Lines[j].ByteCursor += tmpk / 8;
							Lines[j].BitCursor = tmpk % 8;
						}
						tmpi = Lines[j].BitCount % 64;
						tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
						zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
						zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
						memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
						Lines[j].ByteCursor += tmpk / 8;
						Lines[j].BitCursor = tmpk % 8;
						Lines[j].BitCount = 16;
					}
					else
					{
						Lines[j].BitCount += 16;
					}
				}
			}
			for (j = 0; j < 16; j ++)
			{
				tmpj = Lines[j].CurrentBit;
				if (Lines[j].BitCount > 63)
				{
					tmpi = Lines[j].BitCount / 64 + 63;
					tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
					zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
					zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
					memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
					Lines[j].ByteCursor += tmpk / 8;
					Lines[j].BitCursor = tmpk % 8;
				}
				tmpi = Lines[j].BitCount % 64;
				tmpk = Lines[j].BitCursor + HuffmanCode[tmpi].Length[tmpj];
				zipCode.Lint = HuffmanCode[tmpi].Code[tmpj];
				zipCode.Lint = (zipCode.Lint << Lines[j].BitCursor) + Lines[j].LineBuffer[Lines[j].ByteCursor];
				memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 4);
				Lines[j].ByteCursor += tmpk / 8;
				Lines[j].BitCursor = tmpk % 8;
				if (Lines[j].BitCursor > 4) Lines[j].ByteCursor ++;
				zipCode.Lint = NewLineCode.Code[0];
				zipCode.Lint = (zipCode.Lint << 4) + Lines[j].LineBuffer[Lines[j].ByteCursor];
				memcpy(&Lines[j].LineBuffer[Lines[j].ByteCursor], zipCode.Byte, 2);
				Lines[j].ByteCursor += 2;
				ByteCount += Lines[j].ByteCursor;
				fwrite(Lines[j].LineBuffer, 1, Lines[j].ByteCursor, TiffFile);

				if (resolution == HIGH_RESOLUTION)
				{
					ByteCount += Lines[j].ByteCursor;
					fwrite(Lines[j].LineBuffer, 1, Lines[j].ByteCursor, TiffFile);

				}
				Lines[j].BitCount = 64;
				Lines[j].CurrentBit = Lines[j].BitCursor = Lines[j].ByteCursor = 0;
			}
			for (j = 0; j < RowSpace; j ++)
			{
				fwrite(BlankLine, 4, 1, TiffFile);

				ByteCount += 4;
			}
		}
		else
		{
			if (LineNumber == 0) break;
			for (j = 0; j < (32 / resolution + RowSpace); j ++)
			{
				fwrite(BlankLine, 4, 1, TiffFile);

				ByteCount += 4;
			}
		}

		LineNumber ++;
		
		if (LineNumber ==(ImageLength / (32 / resolution + RowSpace)))
		{
			PageNumber ++;
			LineNumber = 0;
			FileOffset = ftell(TiffFile);
			fseek(TiffFile, Ifd.IFDEntries[9].ValueOffset - 8, SEEK_SET);
			fwrite(&ByteCount, 4, 1, TiffFile);
			fwrite(&FileOffset, 4, 1, TiffFile);
			fseek(TiffFile, FileOffset, SEEK_SET);
			if(PageNumber>=50)
				break;
		}
	}
	fseek(TiffFile, 8L, SEEK_SET);
	for (i = 0; i < PageNumber - 1; i ++)
	{
		fseek(TiffFile, 10 + 13 * sizeof(IFDENTRY1), SEEK_CUR);
		fwrite(&i, 2, 1, TiffFile);
		fwrite(&PageNumber, 2, 1, TiffFile);
		fseek(TiffFile, 3 * sizeof(IFDENTRY1), SEEK_CUR);
		fread(&FileOffset, 4, 1, TiffFile);
		fseek(TiffFile, FileOffset, SEEK_SET);
	}
	fseek(TiffFile, 10 + 13 * sizeof(IFDENTRY1), SEEK_CUR);
	fwrite(&i, 2, 1, TiffFile);
	fwrite(&PageNumber, 2, 1, TiffFile);
	fseek(TiffFile, 3 * sizeof(IFDENTRY1), SEEK_CUR);
	FileOffset = 0L;
	fwrite(&FileOffset, 4, 1, TiffFile);
	fclose(TiffFile);
	fclose(TextFile);
	fclose(fp);
	fclose(FontFile);

	free(Ifd.IFDEntries);
	for (i = 0; i < 16; i ++) 
		free(Lines[i].LineBuffer);
	return (0);

}

⌨️ 快捷键说明

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