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

📄 fileconv.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -