使用C语言读取位图Word文档下载推荐.docx
- 文档编号:1108624
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:16
- 大小:18.10KB
使用C语言读取位图Word文档下载推荐.docx
《使用C语言读取位图Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《使用C语言读取位图Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
以下是位图信息结构的定义:
typedefstructtagBITMAPINFO{
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];
}BITMAPINFO;
可见位图信息也是由两部分组成的:
位图信息头+颜色表
2.1位图信息头。
位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。
以下是位图信息头结构的定义:
typedefstructtagBITMAPINFOHEADER{//bmih
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER;
下表是对结构体当中各个成员的说明:
结构成员
说明
biSize
结构BITMAPINFOHEADER的字节数,即sizeof(BITMAPINFOHEADER)*
biWidth
以像素为单位的图像宽度*
biHeight
以像素为单位的图像长度*
biplanes
目标设备的位平面数
biBitCount
每个像素的位数*
(1)
biCompression
图像的压缩格式(这个值几乎总是为0)
biSizeImage
以字节为单位的图像数据的大小(对BI_RGB压缩方式而言)
biXPelsPermeter
水平方向上的每米的像素个数
biYpelsPerMeter
垂直方向上的每米的像素个数
biClrused
调色板中实际使用的颜色数
(2)
biClrImportant
现实位图时必须的颜色数(3)
说明:
*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量
(1)对于每个像素的字节数,分别有一下意义:
0,用在JPEG格式中
1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片
4,16色图
8,256色图,通常说的灰度图
16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量
24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量
32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式
(2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色树木小于制定的颜色深度的颜色数目的最大值。
(3)这个值通常为0,表示所有的颜色都是必需的
2.2颜色表。
颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。
而对于16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。
颜色表的作用就是创建调色板。
颜色表是由颜色表项组成的,颜色表项结构的定义如下:
typedefstructtagRGBQUAD{//rgbq
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。
3、位图数据。
最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:
位图数据。
根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个像素,对于16位位图,每两个字节代表了一个像素,对于24位位图,每三个字节代表了一个像素,对于32位位图,每四个字节代表了一个像素。
下面附上代码:
//Bmp.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
intReadFileHeader(char*filepath,BITMAPFILEHEADER*bmfh);
intReadInfoHeader(char*filepaht,BITMAPINFOHEADER*bmih);
intReadPixelData(char*filepath);
DWORDGetLineBytes(intwidth,intbitCount);
//BYTE*imgData;
//inti=ReadPixelData("
E:
\\1\\1.bmp"
);
inti=ReadPixelData("
D:
\\2.bmp"
scanf("
%d"
return0;
}
//读入文件头
intReadFileHeader(char*filepath,BITMAPFILEHEADER*bmfh)
FILE*fp;
//打开文件
fp=fopen(filepath,"
rb"
if(!
fp)
{//如果打开失败
printf("
Cannotopenthefile:
%s\n"
filepath);
return-1;
}
//读入bfType
if(fread(&
bmfh->
bfType,sizeof(WORD),1,fp)!
=1)
{
CannotreadbfTypeinthefileheader.\n"
fclose(fp);
//读入bfSize
bfSize,sizeof(DWORD),1,fp)!
CannotreadbfSizeinthefileheader.\n"
//读入bfReserved1
bfReserved1,sizeof(WORD),1,fp)!
CannotreadbfReserved1inthefileheader.\n"
//读入bfReserved2
bfReserved2,sizeof(WORD),1,fp)!
CannotreadbfReserved2inthefileheader.\n"
//读入bfOffBits
bfOffBits,sizeof(DWORD),1,fp)!
CannotreadbfOffBitsinthefileheader.\n"
//关闭文件指针
//读入信息头
intReadInfoHeader(char*filepath,BITMAPINFOHEADER*bmih)
//使文件指针跳过文件头(14字节)
fseek(fp,14,SEEK_SET);
//读入biSize
bmih->
biSize,sizeof(DWORD),1,fp)!
CannotreadbiSizeintheinfoheader.\n"
//读入biWidth
biWidth,sizeof(LONG),1,fp)!
CannotreadbiWidthintheinfoheader.\n"
//读入biHeight
biHeight,sizeof(LONG),1,fp)!
CannotreadbiHeightintheinfoheader.\n"
//读入biPlanes
biPlanes,sizeof(WORD),1,fp)!
CannotreadbiPlanesintheinfoheader.\n"
//读入biBitCount
biBitCount,sizeof(WORD),1,fp)!
CannotreadbiBitCountintheinfoheader.\n"
//读入biCompression
biCompression,sizeof(DWORD),1,fp)!
CannotreadbiCompressionintheinfoheader.\n"
//读入biSizeImage
biSizeImage,sizeof(DWORD),1,fp)!
CannotreadbiSizeImageintheinfoheader.\n"
//读入biXPelsPerMeter
biXPelsPerMeter,sizeof(LONG),1,fp)!
CannotreadbiXPelsPerMeterintheinfoheader.\n"
//读入biYPelsPerMeter
biYPelsPerMeter,sizeof(LONG),1,fp)!
CannotreadbiYPelsPerMeterintheinfoheader.\n"
//读入biClrUsed
biClrUsed,sizeof(DWORD),1,fp)!
CannotreadbiClrUsedintheinfoheader.\n"
//读入biClrImportant
biClrImportant,sizeof(DWORD),1,fp)!
CannotreadbiClrImportantintheinfoheader.\n"
//关闭文件
//读取像素数据
intReadPixelData(char*filepath)
BITMAPINFOHEADERbmih;
BITMAPFILEHEADERbmfh;
BYTE*imgdata;
intn;
intwidth;
intheight;
intbitCount;
longbiSizeImage;
inti;
intj;
longa[256]={0};
intp;
DWORDdwLineBytes;
//读入文件头
n=ReadFileHeader(filepath,&
bmfh);
if(n==-1)
CannotreadthefileheaderofBMPfile.\n"
//读入信息头
n=ReadInfoHeader(filepath,&
bmih);
CannotreadtheinfoheaderofBMPfile.\n"
//获取信息头有用信息
width=bmih.biWidth;
height=bmih.biHeight;
bitCount=bmih.biBitCount;
biSizeImage=bmih.biSizeImage;
dwLineBytes=GetLineBytes(width,bitCount);
//printf("
%ld\n"
dwLineBytes);
位图宽:
width);
位图高:
height);
位图位数:
%d\n"
bitCount);
位图所占字节数:
biSizeImage);
fp=fopen(filepath,"
if(bitCount==8||bitCount==24)
fseek(fp,bmfh.bfOffBits,SEEK_SET);
//直接跳到像素数据
}else
此位图为%d位!
"
只支持8或24位"
//给imgdata分配内存
imgdata=(BYTE*)malloc(dwLineBytes*height*sizeof(BYTE));
imgdata)
Cannotallocatememoryforthepixeldata.\n"
//读入像素数据,大小为高度乘上每行所占字节数
n=fread(imgdata,dwLineBytes*height*sizeof(BYTE),1,fp);
if(n==0)
if(ferror(fp))
Cannotreadthepixeldata.\n"
free(imgdata);
图片像素值首地址:
imgdata);
//读取位图像素值
if(bitCount==8)
for(i=0;
i<
height;
i++)
for(j=0;
j<
width;
j++)
//读取灰度值
p=*(imgdata+dwLineBytes*(height-1-i)+j);
a[p]++;
%d,"
p);
\n"
}elseif(bitCount==24)
width*3;
("
//读取蓝色分量
j++;
//读取绿色分量
//读取红色分量
)"
统计结果如下:
256;
位图中%3d有%ld个\n"
i,a[i]);
DWORDGetLineBytes(intwidth,intbitCount)
//首先bitCount是指位图的每个像素所占的二进制位数,不是字节数;
//其次,windows中位图每行所占的字节数必须为4的倍数,
//例如灰度图中每行200个像素占用200个字节,如果每行有201个像素就占用204个字节。
//return((width*bitCount/8+3)/4)*4;
return(width*bitCount+31)/32*4;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 语言 读取 位图
![提示](https://static.bingdoc.com/images/bang_tan.gif)