C语言处理图片二值化程序代码[亲测能用]

#include  
#include
#include

#pragma pack(1)

#define R 30
#define G 59
#define B 11

#define ONE 255 
#define ZERO 0 

typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef unsigned char BYTE;

typedef struct tagBITMAPFILEHEADER { // bmfh 
 WORD bfType; // 位图文件的类型,必须为BM
 DWORD bfSize; // 位图文件的大小,以字节为单位
 WORD bfReserved1; // 位图文件保留字,必须为0
 WORD bfReserved2; // 位图文件保留字,必须为0
 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER; 

typedef struct tagBITMAPINFOHEADER{ // bmih 
 DWORD biSize; // 本结构所占用字节数
 LONG biWidth; // 位图的宽度,以像素为单位
 LONG biHeight; // 位图的高度,以像素为单位
 WORD biPlanes; // 目标设备的级别,必须为1
 WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
 DWORD biSizeImage; // 位图的大小,以字节为单位
 LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
 LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
 DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER; 

typedef struct tagPOINT{
 BYTE b;
 BYTE g;
 BYTE r;
} POINT;

int quit();

int quit()
{
 puts("File's format wrong");
 exit(0);
}

void main (int argc,char *argv[]) 
 FILE *fi,*fo;//I/O file 
 char fin[80],fon[80];//I/O file name 
 BYTE buff,o=0;
 BITMAPFILEHEADER bf;
 BITMAPINFOHEADER bi;
 POINT **p;
 int i,j,t; 
 if(argc<3) 
 { 
  printf("orginfile name:"); 
  scanf("%s",fin); 
  printf("resultfile name:"); 
  scanf("%s",fon); 
 }else{ 
  sscanf(argv[1],"%s",fin); 
  sscanf(argv[2],"%s",fon); 
 } 
 if(argc==4) 
  sscanf(argv[4],"%d",&t); 
 else{ 
  printf("theshold [0,255]:"); 
  scanf("%d",&t); 
 } 

 if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL)) 
 { 
  puts("\nfile open failed"); 
  return; 
 } 

 fread(&bf,sizeof(bf),1,fi);
 fread(&bi,sizeof(bi),1,fi);

 if(bf.bfType!=0x4d42) quit();
 if(bf.bfReserved1!=0x0000) quit();
 if(bf.bfReserved2!=0x0000) quit();

 if(bi.biClrImportant!=0) quit();
 if(bi.biBitCount!=0x18) quit();
 if(bi.biCompression!=0) quit();
 if(bi.biPlanes!=1) quit();

 bf.bfSize=54+1024+bi.biWidth*bi.biHeight;
 bf.bfOffBits=54+1024;
 
 if(bi.biWidth%4==0)
  bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8;
 else
  bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8;
 bi.biBitCount=8;

 p=(POINT **)malloc(sizeof(POINT *)*bi.biHeight);
 for (i=0;i
 *(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth);
 //分配失败后果自负!

 fwrite(&bf,sizeof(bf),1,fo);
 fwrite(&bi,sizeof(bi),1,fo);

 for (i=0;i
  for (j=0;j
   fread(*(p+i)+j,sizeof(POINT),1,fi);

 for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)
 {
  fwrite(&buff,sizeof(buff),1,fo);
  fwrite(&buff,sizeof(buff),1,fo);
  fwrite(&buff,sizeof(buff),1,fo);
  fwrite(&o,sizeof(o),1,fo);
 }

 for (i=0;i
  for (j=0;j
  {
   buff=((*(p+i)+j)->r*R+(*(p+i)+j)->g*G+(*(p+i)+j)->b*B)/100;
   buff=(buff>=t?ONE:ZERO)
   fwrite(&buff,sizeof(buff),1,fo);
  }
 fclose(fo); 

你可能感兴趣的:(技术研究)