// Cannyedge.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "canny.h"
#include<dos.h>
#include<stdio.h>
#include<io.h>
#include<memory.h>
#include<stdlib.h>
//////////////////////////////////////////////////////////////
// 读写文件
//////////////////////////////////////////////////////////////
BYTE *RmwRead8BitBmpFile2Img(const char * filename,long *width,long *height)
{ FILE * BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
BYTE *img;
int size;
int Suc=1;
// Open File
*width=*height=0;
if((BinFile=fopen(filename,"rb"))==NULL) return NULL;
//if((BinFile=fopen("d:\\frame_0003.bmp","rb"))==NULL) return NULL;
// Read Struct Info
if (fread((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=-1;
if (fread((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=-1;
if (Suc==-1) { fclose(BinFile); return NULL; }
// Read Image Data
*width=(BmpHeader.biWidth+3)/4*4;
*height=BmpHeader.biHeight;
size=(BmpHeader.biWidth+3)/4*4*BmpHeader.biHeight;
fseek(BinFile,FileHeader.bfOffBits,SEEK_SET);
if ( (img=new BYTE[size])!=NULL)
{ if(fread(img,sizeof(BYTE),size,BinFile)!=size)
{ fclose(BinFile);
delete img;
img=NULL;
return NULL;
}
}
fclose(BinFile);
return img;
}
int RmwWrite8BitImg2BmpFile(BYTE *img,int width,int height,const char * filename)
{ FILE * BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
BYTE p[4];
int i,Suc=1;
// Open File
if((BinFile=fopen(filename,"w+b"))==NULL) { return -1; }
// Fill the FileHeader
FileHeader.bfType= ((WORD) ('M' << 8) | 'B');
FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BmpHeader)+256*4L;
FileHeader.bfSize=FileHeader.bfOffBits+width*height ;
FileHeader.bfReserved1=0;
FileHeader.bfReserved2=0;
if (fwrite((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=-1;
// Fill the ImgHeader
BmpHeader.biSize = 40;
BmpHeader.biWidth = width;
BmpHeader.biHeight = height;
BmpHeader.biPlanes = 1 ;
BmpHeader.biBitCount = 8 ;
BmpHeader.biCompression = 0 ;
BmpHeader.biSizeImage = 0 ;
BmpHeader.biXPelsPerMeter = 0;
BmpHeader.biYPelsPerMeter = 0;
BmpHeader.biClrUsed = 0;
BmpHeader.biClrImportant = 0;
if (fwrite((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=-1;
// write Pallete
for (i=0,p[3]=0;i<256;i++)
{ p[0]=p[1]=p[2]=i; // blue,green,red;
if (fwrite((void *)p,1,4,BinFile)!=4) { Suc=-1; break; }
}
// write image data
if (fwrite((void *)img,1,width*height,BinFile)!=width*height) Suc=-1;
// return;
fclose(BinFile);
return Suc;
}
void main()
{
SIZE sz;
float Y;
// BITMAPFILEHEADER bf;//文件头
// BITMAPINFOHEADER bi;//信息头
unsigned char* color = NULL;//声明一个数组
color=RmwRead8BitBmpFile2Img("E:\\smooth1.bmp",&(sz.cx),&(sz.cy));
if(color==NULL) {printf("fopen err!\n"); return;}
// FILE* hf;//
BYTE temp;
BYTE *pGray = NULL;
BYTE *pResult = NULL;
/* char buf[80];
printf("please input the bmp file path : ");
scanf("%s",buf);
hf = fopen(buf,"rb");//以读写方式打开一个文件
if(!hf)
{
perror("can not open bmp file!");
exit(1);
}
fread(&bf,sizeof(BITMAPFILEHEADER),1,hf);//从流文件中读取数据到bf中
fread(&bi,sizeof(BITMAPINFOHEADER),1,hf);
if(bi.biWidth %4){
sz.cx = bi.biWidth + 4 -(bi.biWidth %4);
}
else
{
sz.cx = bi.biWidth;
}
sz.cy = bi.biHeight ;
*/
pGray = (unsigned char *)malloc(sz.cx*sz.cy);
pResult = (unsigned char *)malloc(sz.cx*sz.cy);
// color = (unsigned char *)malloc(sz.cy*sz.cx*3);//为位图数据分配空间
// int a= fread(color,1,bi.biSizeImage,hf);//读取数据到数组color中
// fclose(hf);//关闭文件
int i = 0;
/* for(int x =0;x<sz.cx*sz.cy;){
Y = (float)((*(color+x))*0.299+(*(color + x+1))*0.587+(*(color+x+2))*0.114);
temp = (BYTE)Y;
pResult[i] = 0;
pGray[i++] = (unsigned char)temp;
*(color+x) = (unsigned char)temp;
*(color+1+x) = (unsigned char)temp;
*(color+2+x) = (unsigned char)temp;
x = x+3;
}
*/
Canny(color,sz,0.1,0.79,0.82,pResult);
//Edge(pResult,sz);
/*int a =0;
for( x =0;x<i;x++){
*(color +a) = pResult[x];
*(color+1+a) = pResult[x];
*(color+2+a) = pResult[x];
a = a+3;
}
*/
// printf("please input the new bmp file path to save : ");
// memset(buf,0,80);
// scanf("%s",buf);
RmwWrite8BitImg2BmpFile(pResult,sz.cx,sz.cy,"E:\\Canny.bmp");
// hf = fopen(buf,"a+");//这里其实是创建一个不存在的文件
/// fwrite(&bf,sizeof(BITMAPFILEHEADER),1,hf);//将文件头数据写入到文件中
// fwrite(&bi,sizeof(BITMAPINFOHEADER),1,hf);
// fwrite(color,1,bi.biSizeImage,hf);
free(color);
printf("new bmp file has been created successfully!");
free(pGray);
free(pResult);
flushall();
system("pause");
}
- 1
- 2
前往页