📄 fileconv.cpp
字号:
#include "stdafx.h"
#include "FileConv.h"
#include "tiff.h"
// Fax style
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define HIGH_RESOLUTION 1
#define STANDARD_RESOLUTION 2
//
/* ByteOrder values in TIFFHEADER structure */
#define II_ORDER 0x4949
#define MM_ORDER 0x4d4d
//
/* TiffIdentify values in TIFFHEADAER structure */
#define TIFF_IDENTIFY 42
//
typedef struct tiffheader
{
unsigned short ByteOrder;
unsigned short TiffIdentify;
unsigned long IFDOffset;
} TIFFHEADER;
//
/* Tag values in IFDENTRY structure */
#define NEW_SUBFILE_TYPE 0xfe
#define PHOTO_INTERPRET 0x106
#define COMPRESSION 0x103
#define BIT_SAMPLE 0x102
#define IMAGE_LENGTH 0x101
#define IMAGE_WIDTH 0x100
#define FILL_ORDER 0x10a
#define RESOLUTION_UNIT 0x128
#define X_RESOLUTION 0x11a
#define Y_RESOLUTION 0x11b
#define ROWS_STRIP 0x116
#define STRIP_OFFSETS 0x111
#define STRIP_BYTE_COUNTS 0x117
#define ARTIST 0x13b
#define ORIENTATION 0x112
#define SAMPLE_PIXEL 0x115
#define SOFTWARE 0x131
#define DATE_TIME 0x132
#define DOCUMENT_NAME 0x10d
#define PAGE_NAME 0x11d
#define PAGE_NUMBER 0x129
#define X_POSITION 0x11e
#define Y_POSITION 0x11f
#define T4_OPTIONS 0x124
#define T6_OPTIONS 0x125
#define COPYRIGHT 0x8298
//
/* Type values in IFDENTRY structure */
#define BYTE_TYPE 1
#define ASCII_TYPE 2
#define SHORT_TYPE 3
#define LONG_TYPE 4
#define RATIONAL_TYPE 5
#define SBYTE_TYPE 6
#define UNDEFINED_TYPE 7
#define SSHORT_TYPE 8
#define SLONG_TYPE 9
#define SRATIONAL_TYPE 10
#define FLOAT_TYPE 11
#define DOUBLE_TYPE 12
//
typedef struct ifdentry
{
unsigned short Tag;
unsigned short Type;
unsigned long Count;
unsigned long ValueOffset;
} IFDENTRY;
//
typedef struct ifd
{
unsigned short EntryCount;
IFDENTRY IFDEntries[17];
unsigned long NextIFD;
} IFD;
//
typedef struct linespec
{
unsigned short ByteCursor;
unsigned short BitCursor;
unsigned short BitCount;
unsigned short CurrentBit;
unsigned char LineBuffer[1732];
} LINESPEC;
//
STYLEINFO Default_Style=
{
"宋体",//char szFontName[80] ;//字体名称
9, //int FontSize;//字体大小
0, //BOOL bItalic ;
0, //BOOL bUnderline;
1, //BOOL bStrikeOut;
0, //int CharSet;//字符集
12, //int nLeftMargin; //左边预留
0, //int nRightMargin; //右边预留
2, //int nRowSpace; //行间距
};
int CharSet[]=
{
GB2312_CHARSET , //0
ANSI_CHARSET , //1
DEFAULT_CHARSET , //2
SYMBOL_CHARSET , //3
SHIFTJIS_CHARSET , //4
HANGEUL_CHARSET , //5
CHINESEBIG5_CHARSET , //6
OEM_CHARSET , //7
JOHAB_CHARSET , //8
HEBREW_CHARSET , //9
ARABIC_CHARSET , //10
GREEK_CHARSET , //11
TURKISH_CHARSET , //12
VIETNAMESE_CHARSET , //13
THAI_CHARSET , //14
EASTEUROPE_CHARSET , //15
RUSSIAN_CHARSET , //16
MAC_CHARSET , //17
BALTIC_CHARSET , //18
};
typedef union zipcode
{
unsigned long Lint;
unsigned char Byte[4];
} ZIPCODE;
//
typedef struct huffmancode
{
unsigned short Length[2];
unsigned short Code[2];
} HUFFMANCODE;
HUFFMANCODE HuffmanCode[104] = { 8, 10, 0x00ac, 0x03b0,
6, 3, 0x0038, 0x0002,
4, 2, 0x000e, 0x0003,
4, 2, 0x0001, 0x0001,
4, 3, 0x000d, 0x0006,
4, 4, 0x0003, 0x000c,
4, 4, 0x0007, 0x0004,
4, 5, 0x000f, 0x0018,
5, 6, 0x0019, 0x0028,
5, 6, 0x0005, 0x0008,
5, 7, 0x001c, 0x0010,
5, 7, 0x0002, 0x0050,
6, 7, 0x0004, 0x0070,
6, 8, 0x0030, 0x0020,
6, 8, 0x000b, 0x00e0,
6, 9, 0x002b, 0x0030,
6, 10, 0x0015, 0x03a0,
6, 10, 0x0035, 0x0060,
7, 10, 0x0072, 0x0040,
7, 11, 0x0018, 0x0730,
7, 11, 0x0008, 0x00b0,
7, 11, 0x0074, 0x01b0,
7, 11, 0x0060, 0x0760,
7, 11, 0x0010, 0x00a0,
7, 11, 0x000a, 0x0740,
7, 11, 0x006a, 0x00c0,
7, 12, 0x0064, 0x0530,
7, 12, 0x0012, 0x0d30,
7, 12, 0x000c, 0x0330,
8, 12, 0x0040, 0x0b30,
8, 12, 0x00c0, 0x0160,
8, 12, 0x0058, 0x0960,
8, 12, 0x00d8, 0x0560,
8, 12, 0x0048, 0x0d60,
8, 12, 0x00c8, 0x04b0,
8, 12, 0x0028, 0x0cb0,
8, 12, 0x00a8, 0x02b0,
8, 12, 0x0068, 0x0ab0,
8, 12, 0x00e8, 0x06b0,
8, 12, 0x0014, 0x0eb0,
8, 12, 0x0094, 0x0360,
8, 12, 0x0054, 0x0b60,
8, 12, 0x00d4, 0x05b0,
8, 12, 0x0034, 0x0db0,
8, 12, 0x00b4, 0x02a0,
8, 12, 0x0020, 0x0aa0,
8, 12, 0x00a0, 0x06a0,//46
8, 12, 0x0050, 0x0ea0,
8, 12, 0x00d0, 0x0260,
8, 12, 0x004a, 0x0a60,
8, 12, 0x00ca, 0x04a0,
8, 12, 0x002a, 0x0ca0,
8, 12, 0x00aa, 0x0240,
8, 12, 0x0024, 0x0ec0,
8, 12, 0x00a4, 0x01c0,
8, 12, 0x001a, 0x0e40,
8, 12, 0x009a, 0x0140,
8, 12, 0x005a, 0x01a0,
8, 12, 0x00da, 0x09a0,
8, 12, 0x0052, 0x0d40,
8, 12, 0x00d2, 0x0340,
8, 12, 0x004c, 0x05a0,
8, 12, 0x00cc, 0x0660,
8, 12, 0x002c, 0x0e60,//63
5, 10, 0x001b, 0x03c0,
5, 12, 0x0009, 0x0130,
6, 12, 0x003a, 0x0930,
7, 12, 0x0076, 0x0da0,
8, 12, 0x006c, 0x0cc0,
8, 12, 0x00ec, 0x02c0,//384
8, 12, 0x0026, 0x0ac0,
8, 13, 0x00a6, 0x06c0,
8, 13, 0x0016, 0x16c0,
8, 13, 0x00e6, 0x0a40,
9, 13, 0x0066, 0x1a40,
9, 13, 0x0166, 0x0640,
9, 13, 0x0096, 0x1640,
9, 13, 0x0196, 0x09c0,
9, 13, 0x0056, 0x19c0,
9, 13, 0x0156, 0x05c0,
9, 13, 0x00d6, 0x15c0,
9, 13, 0x01d6, 0x0dc0,
9, 13, 0x0036, 0x1dc0,
9, 13, 0x0136, 0x0940,
9, 13, 0x00b6, 0x1940,
9, 13, 0x01b6, 0x0540,
9, 13, 0x0032, 0x1540,
9, 13, 0x0132, 0x0b40,
9, 13, 0x00b2, 0x1b40,
6, 13, 0x0006, 0x04c0,
9, 13, 0x01b2, 0x14c0,//1728
11, 11, 0x0080, 0x0080,
11, 11, 0x0180, 0x0180,
11, 11, 0x0580, 0x0580,
12, 12, 0x0480, 0x0480,
12, 12, 0x0c80, 0x0c80,
12, 12, 0x0280, 0x0280,
12, 12, 0x0a80, 0x0a80,
12, 12, 0x0680, 0x0680,
12, 12, 0x0e80, 0x0e80,
12, 12, 0x0380, 0x0380,
12, 12, 0x0b80, 0x0b80,
12, 12, 0x0780, 0x0780,
12, 12, 0x0f80, 0x0f80};
//
HUFFMANCODE NewLineCode = {12, 12, 0x0800, 0x0800};
//
unsigned char BlankLine[4] = {0xb2, 0x59, 0x01, 0x80};
//
int LineWidth(int w)
{
return ((((w)+31)>>5)<<2);
}
unsigned char ASCII[256][16];
short Read_ASCII()
{
FILE * fp;
int i;
fp = fopen(".\\asc16.dat", "rb");
if (fp == NULL) return (1);
for (i = 0; i < 256; i ++) fread(ASCII[i], 16, 1, fp);
fclose(fp);
return (0);
}
BOOL BMPToFax(LPCTSTR BmpFileName, LPCTSTR FaxFileName,int leftMarge)//,long Style)
{
if( !BmpFileName || !FaxFileName)
return FALSE;
int LeftMargin=leftMarge*8;
if(LeftMargin<0 )
return FALSE;
CFile fileBmp,fileFax;
int BmpWidth,BmpHeight;
char head[11];
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 BmpFilePos;;
int LineBytes,dbLineBytes;
TIFFHEADER TiffHeader;
IFD Ifd;
unsigned char buffer[200];
unsigned long FileOffset = 0L;
unsigned char ImageBuffer[1728/8+1];
////////////////////////////////////////////////////////////////
// open bmp file
////////////////////////////////////////////////////////////////
if(!fileBmp.Open(BmpFileName,CFile::modeRead|CFile::shareDenyNone))
{
return FALSE;
}
fileBmp.Read(head,11);
if(head[0]!='B' || head[1]!='M' || head[10]!=0x3e)
{
fileBmp.Close(); /*不是黑blank/wite BMP文件*/
return FALSE;
}
fileBmp.Seek(18,CFile::begin);
fileBmp.Read(&BmpWidth,sizeof(int));
fileBmp.Seek(22,CFile::begin);
fileBmp.Read(&BmpHeight,sizeof(int));
LineBytes=LineWidth(BmpWidth);
dbLineBytes=LineWidth(BmpWidth*2);
if(dbLineBytes*8+LeftMargin*2>1728) //左边留LeftMargin个像素的空
{
fileBmp.Close();
return FALSE; /*BMP文件超宽*/
}
BmpFilePos=0x3e+(BmpHeight-1)*LineBytes;/*指向第一条扫描线条*/
////////////////////////////////////////////////////////////////
// open fax file
////////////////////////////////////////////////////////////////
if(!fileFax.Open(FaxFileName,CFile::modeCreate|CFile::modeWrite))
{
fileBmp.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;
memset(Ifd.IFDEntries, 0, 17 * sizeof(IFDENTRY));
////////////////////////////////////////////////////////////////
// 写头
////////////////////////////////////////////////////////////////
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 = STRIP_OFFSETS;
Ifd.IFDEntries[9].Type = LONG_TYPE;
Ifd.IFDEntries[9].Count = 1;
Ifd.IFDEntries[10].Tag = STRIP_BYTE_COUNTS;
Ifd.IFDEntries[10].Type = LONG_TYPE;
Ifd.IFDEntries[10].Count = 1;
Ifd.IFDEntries[11].Tag = X_RESOLUTION;
Ifd.IFDEntries[11].Type = RATIONAL_TYPE;
Ifd.IFDEntries[11].Count = 1;
Ifd.IFDEntries[12].Tag = Y_RESOLUTION;
Ifd.IFDEntries[12].Type = RATIONAL_TYPE;
Ifd.IFDEntries[12].Count = 1;
Ifd.IFDEntries[13].Tag = T4_OPTIONS;
Ifd.IFDEntries[13].Type = LONG_TYPE;
Ifd.IFDEntries[13].Count = 1;
Ifd.IFDEntries[13].ValueOffset = 0;
Ifd.IFDEntries[14].Tag = RESOLUTION_UNIT;
Ifd.IFDEntries[14].Type = SHORT_TYPE;
Ifd.IFDEntries[14].Count = 1;
Ifd.IFDEntries[14].ValueOffset = 2;
Ifd.IFDEntries[15].Tag = PAGE_NUMBER;
Ifd.IFDEntries[15].Type = SHORT_TYPE;
Ifd.IFDEntries[15].Count = 2;
Ifd.IFDEntries[16].Tag = COPYRIGHT;
Ifd.IFDEntries[16].Type = ASCII_TYPE;
Ifd.IFDEntries[16].Count = 48;
FileOffset = 8;
Ifd.IFDEntries[11].ValueOffset = FileOffset + 6 + 17 * sizeof(IFDENTRY);
Ifd.IFDEntries[12].ValueOffset = Ifd.IFDEntries[11].ValueOffset + 8;
Ifd.IFDEntries[16].ValueOffset = Ifd.IFDEntries[12].ValueOffset + 8;
Ifd.IFDEntries[9].ValueOffset = Ifd.IFDEntries[16].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; // 0xcc div RESOLUTION
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(BmpHeight>0)
{
memset(&Lines, 0, sizeof(LINESPEC));
memset(ImageBuffer,0, 1728/8/2);
fileBmp.Seek(BmpFilePos,CFile::begin);
fileBmp.Read(&ImageBuffer[LeftMargin/8*2],LineBytes);
for(i=LeftMargin/8*2;i<1728/8/2;i++)
{
if(i<LineBytes)
ImageBuffer[i]=~ImageBuffer[i];
else
ImageBuffer[i]=0;
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -