#include"stdio.h"
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef unsigned int DWORD;
typedef signed int LONG;
typedef int BOOL;
#define FALSE 0
#define TRUE 1
#define bmPixel 256
#define bmSize 512
typedef struct{int x;int y;}Point;
LONG bmWidth,bmHeight;
DWORD bmOffBits;
BYTE bmImg[bmSize][bmSize];
void bmpTest(FILE* fp)
{
WORD bmpTag;
fseek(fp,0L,SEEK_SET);
fread(&bmpTag,sizeof(WORD),1,fp);
if (0x4D42!=bmpTag)
{
puts("The format of this file is error!");
return;
}
}
void getWidth(FILE* fp)
{
fseek(fp,18L,SEEK_SET);
fread(&bmWidth,sizeof(LONG),1,fp);
}
void getHeight(FILE* fp)
{
fseek(fp,22L,SEEK_SET);
fread(&bmHeight,sizeof(LONG),1,fp);
}
void getOffbit(FILE* fp)
{
fseek(fp,10L,SEEK_SET);
fread(&bmOffBits,sizeof(DWORD),1,fp);
}
void getPixel(FILE *fp)
{
int i,j;
fseek(fp,bmOffBits,SEEK_SET);
for (i = 0; i < bmHeight; i++)
for (j = 0; j < bmWidth; j++)
{
fread(&bmImg[i][j],sizeof(BYTE),1,fp);
if (bmImg[i][j] >= 127)
bmImg[i][j] = 255;
else
bmImg[i][j] = 0;
}
}
void calcGirth(BYTE bmImg[bmSize][bmSize],bool mark[bmSize][bmSize])
{
int i,j;
int ans = 0;
//初始化mark全部标记为false
for (i = 0; i < bmHeight; i++)
for (j = 0; j < bmWidth; j++)
mark[i][j] = false;
//从下往上计算,如果相邻的不同则标记
for (i = 1; i < bmHeight; i++)
for (j = 0; j < bmWidth; j++)
if (255==bmImg[i][j]&&0==bmImg[i-1][j])
mark[i][j] = true;
else if (255==bmImg[i-1][j]&&0==bmImg[i][j])
mark[i-1][j] = true;
//从右往左计算,如果相邻的不同则标记
for (i = 0; i < bmHeight; i++)
for (j = 1; j < bmWidth; j++)
if (255==bmImg[i][j]&&0==bmImg[i][j-1])
mark[i][j] = true;
else if (255==bmImg[i][j-1]&&0==bmImg[i][j])
mark[i][j-1] = true;
//计算周长
for (i = 0; i < bmHeight; i++)
for (j = 0; j < bmWidth; j++)
if (true==mark[i][j])
ans ++;
//输出结果
printf("周长 = %d\n",ans);
}
void copyFile(FILE *srcFile,FILE *desFile)
{
int i,j,x,y;
BYTE tmp;
fseek(srcFile,0L,SEEK_SET);
//读文件头信息
for (i = 0; i < bmOffBits; i++)
{
fread(&tmp,sizeof(BYTE),1,srcFile);
fwrite(&tmp,sizeof(BYTE),1,desFile);
}
//读像素信息
fseek(desFile,bmOffBits,SEEK_SET);
for (i = 0; i < bmHeight; i++)
for (j = 0; j < bmWidth; j++)
fwrite(&bmImg[i][j],sizeof(BYTE),1,desFile);
}
void printPoint(Point point)
{
int x = point.x;
int y = point.y;
printf("x = %d y = %d\n",x,y);
}
BOOL isFind(Point point)
{
int x = point.x;
int y = point.y;
if (0==bmImg[y][x])
return TRUE;
return FALSE;
}
int main(void)
{
FILE *fp,*file;
bool mark[bmSize][bmSize];
if (NULL == (fp = fopen("newx2.bmp","rb")))
{
puts("Open the file failure!");
return FALSE;
}
if (NULL == (file = fopen("test.bmp","wb+")))
{
puts("Create the file failure!");
return FALSE;
}
bmpTest(fp);
getWidth(fp);
getHeight(fp);
getOffbit(fp);
getPixel(fp);
calcGirth(bmImg,mark);
copyFile(fp,file);
return 0;
}