原创C语言位图操作.docx
- 文档编号:8182029
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:16
- 大小:19.32KB
原创C语言位图操作.docx
《原创C语言位图操作.docx》由会员分享,可在线阅读,更多相关《原创C语言位图操作.docx(16页珍藏版)》请在冰豆网上搜索。
原创C语言位图操作
#ifndefBITMAPHEARDER_H
#defineBITMAPHEARDER_H
//#include"DefineBM.h"
#include
#include
#include
#include
#include
usingnamespacestd;
staticFILE*fp;
//数据类型定义
typedefunsignedshortWORD;
typedefunsignedlongDWORD;
typedeflongLONG;
typedefunsignedcharBYTE;
typedefstructtagBMFILEHEADER
{//位图文件头结构,该结构体占14个字节。
WORDbfType;//位图文件类型,必须是0x424D,即字符串"BM",也就是说,所有的"*.bmp"文件的头两个字节都是"BM"。
DWORDbfSize;//位图文件的大小,以字节为单位
WORDbfReserved1;//位图文件保留字,必须为0
WORDbfReserved2;//位图文件保留字,必须为0
DWORDbfOffBits;//位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
}BMFILEHEADER;
typedefstructtagBMINFOHEADER
{//位图信息头结构,该结构体共占40个字节。
DWORDbiSize;//本结构所占用字节数,40个字节
DWORDbiSizeImage;//位图的大小,以字节为单位
LONGbiWidth;//位图的宽度,以像素为单位
LONGbiHeight;//位图的高度,以像素为单位
WORDbiPlanes;//目标设备的级别,必须为1
WORDbiBitCount;//每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORDbiCompresses;//位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
LONGbiXPelsPelMeter;//位图水平分辨率,每米像素数
LONGbiYPelsPelMeter;//位图垂直分辨率,每米像素数
DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂。
DWORDbiClrImportant;//位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
}BMINFOHEADER;
typedefstructtagRGBQUAD
{//颜色表,占4个字节。
颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幂个元素)。
RGBQUAD结构是一个结构体类型。
BYTErgbRed;//红色的亮度(值范围为0-255)
BYTErgbGreen;//绿色的亮度(值范围为0-255)
BYTErgbBlue;//蓝色的亮度(值范围为0-255)
BYTErgbReserved;//保留,必须为0
}RGBQUAD;
//对于biBitCount值为8的灰度图像,每像素占8bit,图像中有256种颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为256*sizeof(RGBQUAD)=1024个字节.24位图(真彩图)不要调色板。
typedefstructtagBITMAPINFO
{//位图图像的数据,记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。
位图的一个像素值所占的字节数。
BMINFOHEADERbmiHeader;//位图信息头
RGBQUADbmiColors[1];//颜色表
}BITMAPINFO;
#endif
#ifndefDEFINEBM_H
#defineDEFINEBM_H
#include"BitMapHeader.h"
staticBMFILEHEADER*bmfh;
staticBMINFOHEADER*bmih;
staticintsaveBitCount;
staticBYTE**rordata=NULL;
staticBYTE**imgdata=NULL;//24位色图像数据指针
//检查路径是否合法:
文件能打开;以bmp为后缀名
intCheckFilePath(char*filepath);
//读入位图的文件头
BMFILEHEADER*ReadFileHeader(char*filepath,BMFILEHEADER*bmfh);
//打印位图的文件头
voidPrintFileHeader(BMFILEHEADER*bmfh);
//读入位图的信息头
BMINFOHEADER*ReadInfoHeader(char*filepath,BMINFOHEADER*bmih);
//打印位图的信息头
voidPrintInfoHeader(BMINFOHEADER*bmih);
//创建8位位图的调色板
intCreatePalette(RGBQUADpal[]);
//读入位图的像素数据
intReadPixelData(char*filepath,BYTE*imgData);
//计算每行像素所占的字节数
LONGGetLineBytes(intimgWidth,intbitCount);
//打印位图的像素数据
voidPrintPixelData(BYTE*imgData,intwidth,intheight,intbitCount);
//打印菜单选项
voidPrintMenu();
//另存为位图
intSaveAsImage(char*filepath);
//保存文件头
intSaveFileHeader(FILE*fp);
//保存信息头
intSaveInfoHeader(FILE*fp);
//保存调色板
intSaveColorPalette(FILE*fp);
//保存像素数据
intSavePixelData(FILE*fp);
voidror90(BMFILEHEADER*pbf,BMINFOHEADER*pbi,BYTE**imgdata);
BYTE**read_bmp(char*filename,BYTE**imgdata);
voidShowImage(char*filepath);
#endif
#include"BitMapHeader.h"
#include"DefineBM.h"
intCheckFilePath(char*filepath)
{//检查文件路径是否正确
intlen=strlen(filepath);
charSaveArr[3];
strncpy(SaveArr,&filepath[len-3],3);
if(!
(SaveArr[0]=='b'&&SaveArr[1]=='m'&&SaveArr[2]=='p'))
{
printf("你打开不是位图,或打开的位图格式不对!
请输入以\".bmp\"结尾的图像。
\n");
return-1;
}
if((fp=fopen(filepath,"rb"))==NULL)
{
perror("文件路径打开失败!
");
exit
(1);
}
fclose(fp);
return0;
}
BMFILEHEADER*ReadFileHeader(char*filepath,BMFILEHEADER*bmfh)
{//读入位图文件结构
if(CheckFilePath(filepath)==-1)
printf("文件读入失败!
\n");
if((fp=fopen(filepath,"rb"))==NULL)
{
printf("Failtoopen:
%s\n",filepath);
fclose(fp);
exit
(1);
}
bmfh=(BMFILEHEADER*)malloc(sizeof(BMFILEHEADER));
if(!
bmfh)
{
perror("Failtomallocbmfh.");
exit
(1);
}
if(fread(&bmfh->bfType,sizeof(WORD),1,fp)!
=1)
{
perror("CannotreadbfType!
\n");
fclose(fp);
exit
(1);
}
if(fread(&bmfh->bfSize,sizeof(DWORD),1,fp)!
=1)
{
perror("CannotreadbfSize!
\n");
fclose(fp);
exit
(1);
}
if(fread(&bmfh->bfReserved1,sizeof(WORD),1,fp)!
=1)
{
perror("CannotreadReserved1!
\n");
fclose(fp);
exit
(1);
}
if(fread(&bmfh->bfReserved2,sizeof(WORD),1,fp)!
=1)
{
perror("CannotreadbfReserved2!
\n");
fclose(fp);
exit
(1);
}
if(fread(&bmfh->bfOffBits,sizeof(DWORD),1,fp)!
=1)
{
perror("CannotreadbfOffBits!
\n");
fclose(fp);
exit
(1);
}
fclose(fp);
returnbmfh;
}
voidPrintFileHeader(BMFILEHEADER*bmfh)
{//输出文件结构
printf("\n======================位图文件结构======================\n");
printf("==\tbfType:
%ld\n",bmfh->bfType);
printf("==\tbfSize:
%ld\n",bmfh->bfSize);
printf("==\tbfReserved1:
%ld\n",bmfh->bfReserved1);
printf("==\tbfReserved2:
%ld\n",bmfh->bfReserved2);
printf("==\tbfOffBits:
%ld\n",bmfh->bfOffBits);
printf("==========================================================\n");
getchar();
}
BMINFOHEADER*ReadInfoHeader(char*filepath,BMINFOHEADER*bmih)
{//读取位图信息结构
FILE*fp;
longlinebytes=0;
longi,j;
fp=fopen(filepath,"rb");
if(!
fp)
{
printf("Cannotopenthefile:
%s\n",filepath);
exit
(1);
}
fseek(fp,14,SEEK_SET);
bmih=(BMINFOHEADER*)malloc(sizeof(BMINFOHEADER));
if(!
bmih)
{
perror("Failtomallocbmih");
exit
(1);
}
if(fread(&bmih->biSize,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiSizeintheinfoheader.\n");
getchar();
fclose(fp);
exit
(1);
}
if(fread(&bmih->biWidth,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiWidthintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biHeight,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiHeightintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biPlanes,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbiPlanesintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biBitCount,sizeof(WORD),1,fp)!
=1)
{
printf("CannotreadbiBitCountintheinfoheader.\n");
fclose(fp);
exit
(1);
}
saveBitCount=bmih->biBitCount;
if(fread(&bmih->biCompresses,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiCompressionintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biSizeImage,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiSizeImageintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biXPelsPelMeter,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiXPelsPerMeterintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biYPelsPelMeter,sizeof(LONG),1,fp)!
=1)
{
printf("CannotreadbiYPelsPerMeterintheinfoheader.\n");
fclose(fp);
exit
(1);
}
if(fread(&bmih->biClrUsed,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiClrUsedintheinfoheader.\n");
getchar();
fclose(fp);
exit
(1);
}
if(fread(&bmih->biClrImportant,sizeof(DWORD),1,fp)!
=1)
{
printf("CannotreadbiClrImportantintheinfoheader.\n");
getchar();
fclose(fp);
exit
(1);
}
imgdata=(BYTE**)malloc((sizeof(BYTE*))*(bmih->biHeight));
if(saveBitCount==24)//24位色
{
linebytes=(bmih->biWidth*3+3)/4*4;//一行的字节数,应该是4的整数倍
for(i=0;i
{
imgdata[i]=(BYTE*)malloc(sizeof(BYTE)*linebytes);
}
for(i=0;i
{
for(j=0;j { fread(&imgdata[i][j],sizeof(BYTE),1,fp);//每次只读取一个字节,存入数组 } } } else { printf("只能打开24位位图! \n"); exit (1); } fclose(fp); returnbmih; } voidPrintInfoHeader(BMINFOHEADER*bmih) {//输出位图信息 printf("\n======================位图信息结构======================\n"); printf("==\tbiSize: %ld\n",bmih->biSize); printf("==\tbiWidth: %ld\n",bmih->biWidth); printf("==\tbiHeight: %ld\n",bmih->biHeight); printf("==\tbiPlanes: %ld\n",bmih->biPlanes); printf("==\tbiSizeImage: %ld\n",bmih->biSizeImage); printf("==\tbiBitCount: %ld\n",bmih->biBitCount); printf("==\tbiCompresses: %ld\n",bmih->biCompresses); printf("==\tbiXPelsPelMeter: %ld\n",bmih->biXPelsPelMeter); printf("==\tbiYPelsPelMeter: %ld\n",bmih->biYPelsPelMeter); printf("==\tbiClrUsed: %ld\n",bmih->biClrUsed); printf("==\tbiClrImportant: %ld\n",bmih->biClrImportant); printf("=========================================================\n"); getchar(); } voidror90(BMFILEHEADER*pbf,BMINFOHEADER*pbi,BYTE**imgdata) { FILE*fp; BMFILEHEADERnewbf;//新图像文件头 BMINFOHEADERnewbi;//新图像信息头 longi,j; longlinebytes;//源图像每行的字节数 longnewlinebytes;//新图像每行的字节数 assert(imgdata! =NULL); printf("Width: %d\n",pbi->biWidth); printf("Height: %d\n",pbi->biHeight); //先拷贝源图像的文件头与信息头 memcpy(&newbf,pbf,sizeof(BMFILEHEADER)); memcpy(&newbi,pbi,sizeof(BMINFOHEADER)); newbi.biHeight=pbi->biWidth; newbi.biWidth=pbi->biHeight; linebytes=(pbi->biWidth*3+3)/4*4;//原图像每行的字节数 newlinebytes=(pbi->biHeight*3+3)/4*4;//新图像每行的字节数 rordata=(BYTE**)malloc(sizeof(BYTE*)*pbi->biWidth); for(i=0;i { rordata[i]=(BYTE*)malloc(sizeof(BYTE)*newlinebytes); if(! rordata[i]) { printf("Error...\n"); getchar(); } } //位图数据转置后对应的赋值,三个字节当作矩阵的一个元素 for(i=0;i { for(j=0;j { rordata[linebytes/3-1-j/3][3*i]=imgdata[i][j]; rordata[linebytes/3-1-j/3][3*i+1]=imgdata[i][j+1]; rordata[linebytes/3-1-j/3][3*i+2]=imgdata[i][j+2]; } } if((fp=fopen("C: \\bmp_ror90.bmp","wb+"))==NULL) { puts("Filebmp_ror90.bmpopenerror! "); exit (1); } printf("新图的宽度: %d\n",newbi.biWidth); printf("新图的高度: %d\n",newbi.biHeight); //写文件头、信息头与位图数据到文件 fwrite(&newbf,sizeof(B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 原创 语言 位图 操作