用 c 语言进行数字图像处理.docx

上传人:b****2 文档编号:1739733 上传时间:2023-05-01 格式:DOCX 页数:30 大小:18.94KB
下载 相关 举报
用 c 语言进行数字图像处理.docx_第1页
第1页 / 共30页
用 c 语言进行数字图像处理.docx_第2页
第2页 / 共30页
用 c 语言进行数字图像处理.docx_第3页
第3页 / 共30页
用 c 语言进行数字图像处理.docx_第4页
第4页 / 共30页
用 c 语言进行数字图像处理.docx_第5页
第5页 / 共30页
用 c 语言进行数字图像处理.docx_第6页
第6页 / 共30页
用 c 语言进行数字图像处理.docx_第7页
第7页 / 共30页
用 c 语言进行数字图像处理.docx_第8页
第8页 / 共30页
用 c 语言进行数字图像处理.docx_第9页
第9页 / 共30页
用 c 语言进行数字图像处理.docx_第10页
第10页 / 共30页
用 c 语言进行数字图像处理.docx_第11页
第11页 / 共30页
用 c 语言进行数字图像处理.docx_第12页
第12页 / 共30页
用 c 语言进行数字图像处理.docx_第13页
第13页 / 共30页
用 c 语言进行数字图像处理.docx_第14页
第14页 / 共30页
用 c 语言进行数字图像处理.docx_第15页
第15页 / 共30页
用 c 语言进行数字图像处理.docx_第16页
第16页 / 共30页
用 c 语言进行数字图像处理.docx_第17页
第17页 / 共30页
用 c 语言进行数字图像处理.docx_第18页
第18页 / 共30页
用 c 语言进行数字图像处理.docx_第19页
第19页 / 共30页
用 c 语言进行数字图像处理.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用 c 语言进行数字图像处理.docx

《用 c 语言进行数字图像处理.docx》由会员分享,可在线阅读,更多相关《用 c 语言进行数字图像处理.docx(30页珍藏版)》请在冰点文库上搜索。

用 c 语言进行数字图像处理.docx

用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("

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2