} }
附录3:拼接过程中程序直接输出的某些中间图片
附录4:
#include
#define WIDTHBYTES(bits) (((bits)+31)/32*4) typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG;
unsigned int zuoshuzu[418][100];
34
unsigned int youshuzu[418][100]; unsigned int shangshuzu[418][100]; unsigned int xiashuzu[418][100]; unsigned int noshang[100]; unsigned int noxia[100]; unsigned int nozuo[100]; unsigned int noyou[100]; unsigned int nozuoshang[50];
unsigned int nozuoshanglink[50][100]; unsigned int shangcizuo; unsigned int shangciyou; unsigned int shangcishang; unsigned int shangcixia; unsigned int * zuozhizhen; unsigned int * youzhizhen; unsigned int zuocnt; unsigned int youcnt; unsigned int shangcnt; unsigned int xiacnt; FILE * put; FILE * outzuo; FILE * outyou;
//位图文件头信息结构定义
//其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息) typedef struct tagBITMAPFILEHEADER { DWORD bfSize; //文件大小
WORD bfReserved1; //保留字,不考虑 WORD bfReserved2; //保留字,同上
DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER;
//信息头BITMAPINFOHEADER,也是一个结构,其定义如下: typedef struct tagBITMAPINFOHEADER{ //public:
DWORD biSize; //指定此结构体的长度,为40 LONG biWidth; //位图宽 LONG biHeight; //位图高
WORD biPlanes; //平面数,为1
WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32 DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩 DWORD biSizeImage; //实际位图数据占用的字节数 LONG biXPelsPerMeter; //X方向分辨率 LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 } BITMAPINFOHEADER;
//调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。
//(似乎是调色板结构体个数等于使用的颜色数。) typedef struct tagRGBQUAD { //public: BYTE rgbBlue; //该颜色的蓝色分量 BYTE rgbGreen; //该颜色的绿色分量
35
BYTE rgbRed; //该颜色的红色分量 BYTE rgbReserved; //保留值 } RGBQUAD;
BITMAPFILEHEADER bitHead; BITMAPINFOHEADER bitInfoHead; FILE* pfile;
char strFilea[209][50] = {
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\char strFileb[209][50] = {
\\\\\\\\\\\\\\
36
\\\\\\\\\\\\\\\\\\\\\
void initfile(char * strFil,unsigned int * zuo,unsigned int * you,unsigned int * shang,unsigned int * xia){ //printf(\ //scanf(\ shangcishang = shangcixia = shangcizuo = shangciyou = shangcnt = xiacnt = zuocnt = youcnt = 0; pfile = fopen(strFil,\打开文件 put = fopen(\ outzuo = fopen(\ outyou = fopen(\ if(pfile!=NULL){ //printf(\读取位图文件头信息 WORD fileType; fread(&fileType,1,sizeof(WORD),pfile); if(fileType != 0x4d42){ printf(\ getchar(); return; } fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile); fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile); } else{ printf(\ getchar(); return; } tagRGBQUAD *pRgb ; if(bitInfoHead.biBitCount < 24){ long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number; pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD)); memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD)); int num = fread(pRgb,4,nPlantNum,pfile); } int width = bitInfoHead.biWidth; int height = bitInfoHead.biHeight;//分配内存空间把源图存入内存 int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数
37
BYTE *pColorData=(BYTE *)malloc(height*l_width); memset(pColorData,0,height*l_width); long nData = height*l_width;//把位图数据信息读到数组里 fread(pColorData,1,nData,pfile);//将位图数据转化为RGB数据 tagRGBQUAD* dataOfBmp; dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据 memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD)); if(bitInfoHead.biBitCount<24){ int k; int index = 0; if (bitInfoHead.biBitCount == 1){ for(int i=0;i
38