没有合适的资源?快使用搜索试试~ 我知道了~
256级灰度BMP文件读写的源代码+c语言图像处理.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 103 浏览量
2021-09-13
19:25:20
上传
评论
收藏 473KB DOCX 举报
温馨提示
试读
12页
...
资源推荐
资源详情
资源评论
本文档最早发布于 http://blog.sina.com.cn/u/1495182054
1.256 级灰度BMP 文件读写的源代码!
首先要明白 256 级灰度 BMP 文件的格式
1.首先是一个 14 个字节的文件头,定义如下
typedef struct tagBITMAPFILEHEADER{
WORD
bfType;
bfSize;
DWORD
WORD
WORD
bfReserved1;
bfReserved2;
bfOffBits;
DWORD
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
bfType 是表明 BMP 文件类型的数据,在这里我们填入的是 0x4d42,其实就是 BM 两个字,
bfSize 是文件大小,bfOffBits 是文件头到数据块的偏移量,对于256 级灰度图,就是 1078
个字节,后面会做描述
2.接下来是 40 个字节的是描述位图属性的 40 个字节
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG
LONG
WORD
WORD
biWidth;
biHeight;
biPlanes;
biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG
LONG
biXPelsPerMeter;
biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
这里面只有 biWidth 表示宽度,biPlanes 表示高度,biBitCount 对于 256 级灰度正好是 8
3.由于是 256 级灰度图,那么有 256 个调色板数据,
每个调色板是如下定义的
typedef struct tagRGBQUAD {
BYTE
BYTE
BYTE
BYTE
rgbBlue;
rgbGreen;
rgbRed;
rgbReserved;
}RGBQUAD, *PRGBQUAD;
调色板数据其实告诉了显示器实际显示的时候的具体颜色,所以调色板长度是 1024 字节
4.最后是按行组织的图像数据,但这些数据并不是简
单的按照图像的高度宽度 w*h 的数组数据这些数据最
重要的特点是
a.按行组织,每行宽度是 w,但是要进行 4 个字节的对齐。比如如果是图像宽度是 253,那么
数据对齐后一行还是有 256 个字节。对齐可以用下面的宏来计算
#define GET_ALIGN(x) (((x+3)/4)*4)
b.图像数据是倒行的,也就是数据第一行对应图像最后一行,最后一行数据对应第一行
图像的实际数据之前的偏移量是:
sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)=14+40+102
4=1078 个字节。
下面是实际的 BMP 文件输入输出函数代码:
/*********************************************/
从文件读入内存代码:
pw 返回宽度;
ph 返回高度;
函数返回内存指针;
/*********************************************/
unsigned char* read_bmp(const char* pszFileName, int* pw, int* ph)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bmh;
FILE *fp;
unsigned char* pImg = NULL;
int i;
fp=fopen(pszFileName, "rb");//二进制打开
if(fp==NULL) return NULL;
fread(&bfh, sizeof(BITMAPFILEHEADER),1, fp);
fread(&bmh, sizeof(BITMAPINFOHEADER),1, fp);
//判断是否 8bit 的图像
if(bfh.bfType!=0x4d42 && bmh.biBitCount!=8) return NULL;
pImg=(unsigned char*)malloc(bmh.biWidth*bmh.biHeight);//开辟空间
*pw=bmh.biWidth;
*ph=bmh.biHeight;
for(i=0; i<bmh.biHeight; i++)
{
fseek(fp, 1078+(bmh.biHeight-i-1)*GET_ALIGN(bmh.biWidth), SEEK_SET);
fread(pImg+i*bmh.biWidth, 1, bmh.biWidth, fp);
}
fclose(fp);
return pImg;
}
/*********************************************/
bmp 文件输出 :将数据从*pImg 存入* pszFileName 指向的文件中
w 指定宽度,h 指定高度。
/*********************************************/
void write_bmp(const char* pszFileName, unsigned char* pImg, int w, int h)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bmh;
RGBQUAD bmiColors[256];
FILE* fp;
int i;
fp=fopen(pszFileName, "wb");
if(fp==NULL) return;
//写位图文件头
bfh.bfType = 0x4d42;
bfh.bfSize = GET_ALIGN(w)*h+1078;
bfh.bfOffBits = 1078;
bfh.bfReserved1=0;
bfh.bfReserved2=0;
//设置位图参数
bmh.biSize
bmh.biWidth
= 40;
= w;
bmh.biHeight = h;
bmh.biPlanes = 1;
bmh.biBitCount= 8;
bmh.biCompression = 0;
bmh.biSizeImage
= GET_ALIGN(w)*h;
bmh.biXPelsPerMeter = 0;
bmh.biYPelsPerMeter = 0;
bmh.biClrUsed
bmh.biClrImportant = 0;
//创建 256 个灰度调色板
= 0;
for(i=0; i<256; i++)
{
bmiColors[i].rgbRed
= (BYTE)i;
bmiColors[i].rgbGreen = (BYTE)i;
bmiColors[i].rgbBlue = (BYTE)i;
}
fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, fp);//bfh 指向被写入的数据,fp 指向被改
写的文件
fwrite(&bmh, sizeof(BITMAPINFOHEADER), 1, fp);
fwrite(bmiColors, sizeof(RGBQUAD), 256, fp); //调色板写入文件
剩余11页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SVID_20240523_141155_1.mp4
- Code for the complete guide to tkinter tutorial
- 关于百货中心供应链管理系统.zip
- SimpleFolderIcon-master 修改Unity的Project下的文件夹图标
- A python Tkinter widget to display tile based maps
- A pure Python library for adding tables to a Tkinter application
- Vector资源文件.zip
- MobaXterm-Installer
- MicroMsg.xlsx
- 88-520告白(520气球).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功