📄 fileconv.cpp
字号:
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 + -