📄 tiff.cpp
字号:
#include <windows.h>
#pragma hdrstop
#include <condefs.h>
//////////////////////////
#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#include <malloc.h>
#include "tiff.h"
#include "huffman.h"
///////////////////////////
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------
/*unsigned char ASCII[256][16];
short int __stdcall Read_ASCII (void)
{
FILE * fp;
int i;
fp = fopen("asc16", "rb");
if (fp == NULL) return (1);
for (i = 0; i < 256; i ++) fread(ASCII[i], 16, 1, fp);
fclose(fp);
return (0);
} */
short int WINAPI TextToTiff (const char* inputfile, const char* outputfile, unsigned short resolution)
{
FILE * TextFile, * TiffFile, * fp;
unsigned long FileOffset = 0L;
unsigned short PageNumber = 0, LineNumber = 0;
unsigned short wbuffer[16];
unsigned char buffer[100];
unsigned char ASCII[256][16];
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;
int k;
LINESPEC Lines[16];
ZIPCODE zipCode;
TIFFHEADER TiffHeader;
IFD Ifd;
fp = fopen("asc16", "rb");
if (fp == NULL) return (1);
for (k = 0; k < 256; k ++) fread(ASCII[k], 16, 1, fp);
fclose(fp);
//return (0);
if (resolution == HIGH_RESOLUTION)
{
ImageLength = 2310;
RowSpace = 3;
}
else if (resolution == STANDARD_RESOLUTION)
{
ImageLength = 1122;
RowSpace = 1;
}
else return (6);
if (!(TextFile = fopen(inputfile, "r"))) return (1);
if (!(TiffFile = fopen(outputfile, "wb+"))) return (2);
if (!(FontFile = fopen("hzk16", "rb"))) return (5);
memset(&TiffHeader, 0, sizeof(TIFFHEADER));
memset(&Ifd, 0, sizeof(IFD));
TiffHeader.ByteOrder = II_ORDER;
TiffHeader.TiffIdentify = TIFF_IDENTIFY;
TiffHeader.IFDOffset = 8;
Ifd.EntryCount = 17;
Ifd.IFDEntries = (IFDENTRY *)malloc(17 * sizeof(IFDENTRY));
if (Ifd.IFDEntries == NULL)
{
return (4);
}
for (i = 0; i < 16; i ++)
{
memset(&Lines[i], 0, sizeof(LINESPEC));
Lines[i].BitCount = 64;
Lines[i].LineBuffer = (unsigned char *)malloc(432);
if (Lines[i].LineBuffer == NULL) return (4);
}
memset(Ifd.IFDEntries, 0, 17 * sizeof(IFDENTRY));
fwrite(&TiffHeader, sizeof(TIFFHEADER), 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)
{
memset(TextBuffer, 0, 108);
if (fgets((char *)TextBuffer, 105, TextFile))
{
for (j = 0; j < 16; j ++) memset(Lines[j].LineBuffer, 0, 432);
if (LineNumber == 0)
{
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;
fwrite(&Ifd.EntryCount, 2, 1, TiffFile);
fwrite(Ifd.IFDEntries, sizeof(IFDENTRY), 17, TiffFile);
Ifd.NextIFD = 0;
fwrite(&Ifd.NextIFD, 4, 1, TiffFile);
memset(buffer, 0, 8);
buffer[0] = 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] = 0x80;
fwrite(buffer, 2, 1, TiffFile);
ByteCount = 2;
}
TextBuffer[strlen(TextBuffer)/* - 1*/] = 0; /////////////
/* if (TextBuffer[strlen(TextBuffer) - 1] = '\n')
TextBuffer[strlen(TextBuffer) - 1] = 0;
else TextBuffer[strlen(TextBuffer) ] = 0; */
for (i = 0; i < 103; )
{
if (i >= strlen(TextBuffer))
{
i = (104 - strlen(TextBuffer)) * 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) < strlen(TextBuffer)) &&
(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))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -