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