源程序-基础训练

#include
#include

unsigned char*pBmpBuf=NULL;//读入图像数据的指针
unsigned char*pBmpBuf2=NULL;//读入图像数据的指针
int bmpWidth;
int bmpHeight;
RGBQUAD *pColorTable;//颜色表指针
int biBitCount; //图像类型,每像素的位数
//读程序可读取8,24位图,本实验是对8位灰度图进行操作,满足要求
bool readBmp(char *bmpName,int ImageWidth,int ImageHeight)
{
int i,j; //行列数
BYTE **B; //分别对应图像的RGB,本实验中RGB相等,故意义不大
BYTE **R;
BYTE **G;
FILE *fp=fopen(bmpName,"rb"); //打开文件
if(fp==0) return 0;
fseek(fp,sizeof(BITMAPFILEHEADER),0); //找出头文件
BITMAPINFOHEADER head;
fread(&head,sizeof(BITMAPINFOHEADER),1,fp);
ImageWidth=head.biWidth; //图像宽度赋值
ImageHeight=head.biHeight; //图像高度赋值
bmpWidth=ImageWidth;
bmpHeight=ImageHeight;
biBitCount=head.biBitCount;
int lineByte=(bmpWidth*biBitCount/8+3)/4*4; //一行中信息点字节
if (biBitCount==8)
{
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}

pBmpBuf=new unsigned char[lineByte*bmpHeight];
fread(pBmpBuf,1,lineByte*bmpHeight,fp);
//开空间
B=NULL;
B=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);
for(i=0; iB[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);
if(B==NULL)
{
printf("fail to malloc B\n");
exit(0);
}

G=NULL;
G=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);
for(i=0; iG[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);
if(G==NULL)
{
printf("fail to malloc G\n");
exit(0);
}
R=NULL;
R=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);
for(i=0; iR[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);
if(R==NULL)
{
printf("fail to malloc R\n");
exit(0);
}
//读图像的RGB
if (biBitCount==8)
{
for(i=0;i{
for(j=0;j
{
B[i][j]=*(pBmpBuf+i*lineByte+j);
G[i][j]=*(pBmpBuf+i*lineByte+j);
R[i][j]=*(pBmpBuf+i*lineByte+j);
printf("(B=%d,G=%d,R=%d)\n",B[i][j],G[i][j],R[i][j]);
}
}
}
else if (biBitCount==24)
{
for(i=0;i{
for(j=0;j{
B[i][j]=*(pBmpBuf+i*lineByte+j*3+0);
G[i][j]=*(pBmpBuf+i*lineByte+j*3+1);
R[i][j]=*(pBmpBuf+i*lineByte+j*3+2);
printf("(B=%d,G=%d,R=%d)\n",B[i][j],G[i][j],R[i][j]);
}
}

}
fclose(fp);
//释放空间
for(i=0; ifree(B[i]);
free(B);
B=NULL;

for(i=0; ifree(G[i]);
free(G);
G=NULL;

for(i=0; ifree(R[i]);
free(R);
R=NULL;
return 1;
}

bool writeBmp(char *bmpName, int ImageWidth,int ImageHeight)
{
unsigned char *imgBuf=pBmpBuf2;
if(!imgBuf)
return 0;
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
int lineByte=(ImageWidth*biBitCount/8+3)/4*4;
FILE *fp=fopen(bmpName,"wb");

if (fp==0) return 0;
BITMAPFILEHEADER fileHead;
fileHead.bfType=0x4D42;
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*ImageHeight;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
fileHead.bfOffBits=54+colorTablesize;
fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
BITMAPINFOHEADER head;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=ImageHeight;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*ImageHeight;
head.biWidth=ImageWidth;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
if (biBitCount==8)
fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
fwrite(imgBuf,ImageHeight*lineByte,1,fp);
fclose(fp);
return 1;
}
void Med()
{int i,j,a,b;
BYTE p[9],s;
int lineByte=(bmpWidth +3)/4*4; //计算一行中储存信息的字节数
pBmpBuf2=new unsigned char[lineByte*bmpHeight];
memcpy(pBmpBuf2,pBmpBuf,lineByte*bmpHeight); //将原图复制

//观察窗取3*3的矩形窗
for(i=1;i
{for(j=3;j//取原图像中该点周围的一个矩形部分
{p[0]=*(pBmpBuf+(i-1)*lineByte+j-3);
p[1]=*(pBmpBuf+(i-1)*lineByte+j);
p[2]=*(pBmpBuf+(i-1)*lineByte+j+3);
p[3]=*(pBmpBuf+i*lineByte+j-3);
p[4]=*(pBmpBuf+i*lineByte+j);
p[5]=*(pBmpBuf+i*lineByte+j+3);
p[6]=*(pBmpBuf+(i+1)*lineByte+j-3);
p[7]=*(pBmpBuf+(i+1)*lineByte+j);
p[8]=*(pBmpBuf+(i+1)*lineByte+j+3);
//排序
for(a=0;a<5;a++)
{
for(b=a+1;b<9;b++)
{
if (p[a]>p[b])
{
s=p[a];
p[a]=p[b];
p[b]=s;
}
}
}
*(pBmpBuf2+i*lineByte+j)=p[4]; //取中值
}
}
}

void main()
{
char readPath[]="输入图像.bmp";
readBmp(readPath,bmpWidth,bmpHeight);
printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount);
Med();
char writePath[]="输出图像.bmp";
writeBmp(writePath,bmpWidth,bmpHeight);
delete []pBmpBuf;
delete []pBmpBuf2;
if(biBitCount==8)
delete[] pColorTable;
}

相关文档
最新文档