用 c 语言进行数字图像处理.docx
《用 c 语言进行数字图像处理.docx》由会员分享,可在线阅读,更多相关《用 c 语言进行数字图像处理.docx(30页珍藏版)》请在冰豆网上搜索。
用c语言进行数字图像处理
用c语言进行数字图像处理
其实,数字图像处理有几步呢?
一共三步。
第一步,读入图片。
第二步,处理图片。
第三步,保存图片。
而第二步主要涉及的是处理图像的算法,所以,我在这里就不多说了。
而第一步和第三步是为第二步做
位图文件结构的声明:
BMP.h
#ifndefBMP_H_INCLUDED
#defineBMP_H_INCLUDED
typedefunsignedshortWORD;
typedefunsignedlongDWORD;
typedeflongLONG;
typedefunsignedcharBYTE;
typedefstructtagBITMAPFILEHEADER
{//bmfh
WORDbfType;
DWORDbfSize;
WORDbfReserved1;
WORDbfReserved2;
DWORDbfOffBits;
}BITMAPFILEHEADER;
typedefstructtagBITMAPINFOHEADER
{//bmih
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount;
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER;
typedefstructtagRGBQUAD
{//rgbq
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
typedefstructtagBITMAPINFO
{
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];
}BITMAPINFO;
#endif//BMP_H_INCLUDED
主程序:
main.c
#include
#include
#include
#include
#include
#include
#include"BMP.h"
BITMAPFILEHEADERbmfh;
BITMAPINFOHEADERbmih;
BYTE*imgData;
boolbReadBMFH=false;
boolbReadBMIH=false;
boolbReadPixel=false;
//检查路径是否合法:
文件能打开;以bmp为后缀名
intCheckFilePath(char*filepath);
//读入位图的文件头
intReadFileHeader(char*filepath,BITMAPFILEHEADER*bmfh);
//打印位图的文件头
voidPrintFileHeader(BITMAPFILEHEADER*bmfh);
//读入位图的信息头
intReadInfoHeader(char*filepath,BITMAPINFOHEADER*bmih);
//打印位图的信息头
voidPrintInfoHeader(BITMAPINFOHEADER*bmih);
//创建8位位图的调色板
intCreatePalette(RGBQUADpal[]);
//读入位图的像素数据
intReadPixelData(char*filepath,BYTE*imgData);
//计算每行像素所占的字节数
LONGGetLineBytes(intimgWidth,intbitCount);
//打印位图的像素数据
voidPrintPixelData(BYTE*imgData,intwidth,intheight,intbitCount);
//打印菜单选项
voidPrintMenu();
//另存为位图
intSaveAsImage(char*filepath);
//显示位图
voidShowImage(char*filepath);
//保存文件头
intSaveFileHeader(FILE*fp);
//保存信息头
intSaveInfoHeader(FILE*fp);
//保存调色板
intSaveColorPalette(FILE*fp);
//保存像素数据
intSavePixelData(FILE*fp);
intmain()
{
charfilepath[256];
charsaveasfilepath[256];
inti;
intwidth;
intheight;
intbitCount;
DWORDdwLineBytes;
intselect;
intq=0;
system("echooff");
system("color2");
printf("-----------TIMimage-----------\n");
printf("InputthepathoftheBMPfile:
\n");
gets(filepath);
i=CheckFilePath(filepath);
if(i==-1)
{
return-1;
}
do
{
PrintMenu();
scanf("%u",&select);
switch(select)
{
case0:
{
printf("InputthepathoftheBMPfile:
\n");
scanf("%s",filepath);
CheckFilePath(filepath);
break;
}
case1:
{
i=ReadFileHeader(filepath,&bmfh);
if(i!
=-1)
{
printf("Readthefileheadersuccessfully.\n");
bReadBMFH=true;
break;
}
else
{
printf("Readthefileheaderfailed.\n");
bReadBMFH=false;
q=1;
break;
}
}
case2:
{
i=ReadInfoHeader(filepath,&bmih);
if(i!
=-1)
{
printf("Readtheinfoheadersuccessfully.\n");
bReadBMIH=true;
break;
}
else
{
printf("Readtheinfoheaderfailed.\n");
bReadBMIH=false;
q=1;
break;
}
}
case3:
{
if(!
bReadBMIH)
{
printf("Pleasereadtheinfoheaderatfirst.\n");
break;
}
height=bmih.biHeight;
width=bmih.biWidth;
bitCount=bmih.biBitCount;
dwLineBytes=GetLineBytes(width,bitCount);
imgData=(BYTE*)malloc(dwLineBytes*height*sizeof(BYTE));
if(!
imgData)
{
printf("Cannotallocatememoryfortheimage.\n");
q=1;
break;
}
i=ReadPixelData(filepath,imgData);
if(i==-1)
{
printf("Readthepixeldatafailed.\n");
bReadPixel=false;
q=1;
break;
}
else
{
printf("Readthepixeldatasuccessfully.\n");
bReadPixel=true;
break;
}
}
case4:
{
if(bReadBMFH)
{
PrintFileHeader(&bmfh);
break;
}
else
{
printf("Pleasereadthefileheaderatfirst.\n");
break;
}
}
case5:
{
if(bReadBMIH)
{
PrintInfoHeader(&bmih);
break;
}
else
{
printf("Pleasereadtheinfoheaderatfirst.\n");
break;
}
}
case6:
{
if(bReadPixel)
{
PrintPixelData(imgData,width,height,bitCount);
break;
}
else
{
printf("Pleasereadthepixeldataatfirst.\n");
break;
}
}
case7:
{
ShowImage(filepath);
break;
}
case8:
{
printf("Inputthepath(ex.d:
//poon.bmp)youwanttosave:
\n");
scanf("%s",saveasfilepath);
i=SaveAsImage(saveasfilepath);
if(i==-1)
{
printf("Error:
failedtosavetheimage.\n");
break;
}
break;
}
default:
q=1;
break;
}
select=9527;
}while(q==0);
return0;
}
intReadFileHeader(char*filepath,BITMAPFILEHEADER*bmfh)
{
FILE*fp;
fp=fopen(filepath,"rb");
if(!
fp)
{
printf("Cannotopenthefile:
%s\n",filepath);
return-1;
}
if(fread(&bmfh->bfType,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbfTypeinthefileheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmfh->bfSize,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbfSizeinthefileheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmfh->bfReserved1,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbfReserved1inthefileheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmfh->bfReserved2,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbfReserved2inthefileheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmfh->bfOffBits,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbfOffBitsinthefileheader.\n");
fclose(fp);
return-1;
}
fclose(fp);
return0;
}
intReadInfoHeader(char*filepath,BITMAPINFOHEADER*bmih)
{
FILE*fp;
fp=fopen(filepath,"rb");
if(!
fp)
{
printf("Cannotopenthefile:
%s\n",filepath);
return-1;
}
fseek(fp,14,SEEK_SET);
if(fread(&bmih->biSize,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiSizeintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biWidth,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiWidthintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biHeight,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiHeightintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biPlanes,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbiPlanesintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biBitCount,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbiBitCountintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biCompression,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiCompressionintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biSizeImage,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiSizeImageintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biXPelsPerMeter,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiXPelsPerMeterintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biYPelsPerMeter,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiYPelsPerMeterintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biClrUsed,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiClrUsedintheinfoheader.\n");
fclose(fp);
return-1;
}
if(fread(&bmih->biClrImportant,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiClrImportantintheinfoheader.\n");
fclose(fp);
return-1;
}
fclose(fp);
return0;
}
intCreatePalette(RGBQUADpal[])
{
inti;
if(sizeof(pal)/sizeof(RGBQUAD)!
=256)
{
printf("Thesizeofthepalettemustbe256.\n");
return-1;
}
for(i=0;i<256;i++)
{
pal[i].rgbBlue=i;
pal[i].rgbGreen=i;
pal[i].rgbRed=i;
pal[i].rgbReserved=0;
}
return0;
}
intReadPixelData(char*filepath,BYTE*imgData)
{
BITMAPINFOHEADERbmih;
BITMAPFILEHEADERbmfh;
BYTE*data;
FILE*fp;
intn;
intwidth;
intheight;
intbitCount;
DWORDdwLineBytes;
n=ReadFileHeader(filepath,&bmfh);
if(n==-1)
{
printf("CannotreadthefileheaderoftheBMPfile.\n");
return-1;
}
n=ReadInfoHeader(filepath,&bmih);
if(n==-1)
{
printf("CannotreadtheinfoheaderoftheBMPfile.\n");
return-1;
}
width=bmih.biWidth;
height=bmih.biHeight;
bitCount=bmih.biBitCount;
dwLineBytes=GetLineBytes(width,bitCount);
if(_msize(imgData)!
=(dwLineBytes*height))
{
printf("Thesizeyouallocateforthepixeldataisnotright.\n");
printf("Fittablesize:
%ldbytes.\n",(dwLineBytes*height));
printf("Yoursize:
%ldbytes.\n",sizeof(imgData));
return-1;
}
data=(BYTE*)malloc(dwLineBytes*height*sizeof(BYTE));
if(!
data)
{
printf("Cannotallocatememoryforthepixeldata.\n");
return-1;
}
fp=fopen(filepath,"rb");
if(!
fp)
{
printf("Cannotopenthefile:
%s\n",filepath);
free(data);
return-1;
}
if(bitCount==8)
{
fseek(fp,bmfh.bfOffBits,SEEK_SET);
}
elseif(bitCount==24)
{
fseek(fp,bmfh.bfOffBits,SEEK_SET);
}
else
{
printf("OnlySupport:
8or24bits.\n");
free(data);
fclose(fp);
return-1;
}
n=fread(data,dwLineBytes*height*sizeof(BYTE),1,fp);
if(n==0)
{
if(feof(fp))
{
}
if(ferror(fp))
{
printf("Cannotreadthepixeldata.\n");
free(data);
fclose(fp);
return-1;
}
}
memcpy(imgData,data,dwLineBytes*height*sizeof(BYTE));
free(data);
fclose(fp);
return0;
}
voidPrintFileHeader(BITMAPFILEHEADER*bmfh)
{
printf("ThecontentsinthefileheaderoftheBMPfile:
\n");
printf("bfOffBits:
%ld\n",bmfh->bfOffBits);
printf("bfReserved1:
%ld\n",bmfh->bfReserved1);
printf("