• 大小: 263KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: 其他
  • 标签: 读BMP  写BMP  灰度BMP  

资源简介

读写8位BMP灰度图像,程序简洁、准确,是我发现最好的读BMP程序。里面有测试图像。

资源截图

代码片段和文件信息

/***********************************************************************
*功能:读写8位BMP灰度图像。
*姓名:Daniel
*单位:中科院苏州医工所
*时间:2012.10.19
***********************************************************************/

#include 
#include 
#include 

/***********************************************************************
*函数名称:
* readBmp()
*
*函数参数:
* char *bmpName -文件名字及路径
* int *bmpWidth -图像宽度指针变量
* int *bmpHeight -图像高度指针变量
*
*返回值:
* unsigned char * -图像数据指针
*
*说明:
* (1)给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素
*位数等数据进内存。
* (2)该读程序仅针对灰度图像(biBitCount=8)格式
***********************************************************************/
unsigned char *readBmp(char *bmpNameint *bmpWidthint *bmpHeight)
{
//二进制读方式打开指定的图像文件
FILE *fp=fopen(bmpName“rb“);
if(fp==0) return 0;

//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp sizeof(BITMAPFILEHEADER)0); //moves the file pointer to a specified location

//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(&head sizeof(BITMAPINFOHEADER) 1fp); 

//获取图像宽、高等信息
*bmpWidth = head.biWidth;
*bmpHeight = head.biHeight;

//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int biBitCount=8; //8位灰度图像
int lineByte=((*bmpWidth)*biBitCount/8+3)/4*4;

//灰度图像有颜色表,且颜色表表项为256
RGBQUAD *pColorTable=new RGBQUAD[256]; //申请颜色表所需要的空间
fread(pColorTablesizeof(RGBQUAD)256fp); //读颜色表进内存

//申请位图数据所需要的空间,读位图数据进内存
unsigned char *pBmpBuf=new unsigned char[lineByte*(*bmpHeight)];
fread(pBmpBuf1lineByte*(*bmpHeight)fp);

//关闭文件
fclose(fp);

return pBmpBuf;


/***********************************************************************
*函数名称:
* saveBmp()
*
*函数参数:
* unsigned char *imgBuf-待存盘的位图数据
*   int width-以像素为单位待存盘位图的宽
*   int height-以像素为单位待存盘位图高
* char *bmpName-文件名字及路径
*
*返回值:
*   0为失败,1为成功
*
*说明:
* 1.给定一个图像的位图数据、宽、高等信息,将其写到指定文件中。
* 2.该读程序仅针对灰度图像(biBitCount=8)格式
***********************************************************************/
bool saveBmp(unsigned char *imgBuf int width int height char *bmpName)
{
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf) return 0;

int biBitCount=8; //每个像素所占的位数(bit)

//颜色表大小,以字节为单位,灰度图像颜色表为1024字节
int colorTablesize=1024;

//待存储图像数据每行字节数为4的倍数
int lineByte=(width * biBitCount/8+3)/4*4;

//以二进制写的方式打开文件
FILE *fp=fopen(bmpName“wb“);
if(fp==0) return 0;

//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType=0x4D42; //bmp类型

//bfSize是图像文件4个组成部分之和
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;

//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;

//写文件头进文件
fwrite(&fileHead sizeof(BITMAPFILEHEADER)1 fp);

//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head;
head.biSize=40; //本结构的长度
head.biWidth=width; //位图的宽度,以像素为单位
head.biHeight=height; //位图的宽度,以像素为单位
head.biPlanes=1; //目标设备的级别,必须是1
head.biBitCount=biBitCount; //每个像素所占的位数(bit),其值必须为1(黑白图像),4(16色图),

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件      191174  2012-10-18 10:20  读写灰度BMP图像程序[经典]\TestBmpRdWt.bmp
     文件      191174  2012-10-19 15:28  读写灰度BMP图像程序[经典]\TestBmpRdWt_New.bmp
     文件        5118  2012-10-19 16:43  读写灰度BMP图像程序[经典]\main.cpp
     目录           0  2012-10-19 16:31  读写灰度BMP图像程序[经典]\

评论

共有 条评论

相关资源