读取bmp图片的文件头,与位图信息头

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <Windows.h>


void eee(FILE* fp)
{
    BITMAPFILEHEADER bf = {};
    BITMAPINFOHEADER bi = {};
    fread(&bf, 1, sizeof(bf), fp);
    fread(&bi, 1, sizeof(bi), fp);
    printf("BM %x\t\t-- bfType: 位图文件的类型,必须为\n", bf.bfType);
    printf("%d\t\t-- bfSize:  位图文件的大小,以字节为单位\n", bf.bfSize);
    printf("%d\t\t--bfReserved1:  位图文件保留字,必须为0\n", 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
读取 BMP 文件的 C++程序 最近做一个图像处理的作业,写了个 BMP 文件读取的程序。 在网上找了些资料,还是当作学习笔记记下来,以后也好看看。 读取文件是 cameraman.bmp 黑白图像,256×256×256 色的。 #include <fstream> #include <iostream> using namespace std; typedef unsigned char var8; typedef unsigned int uvar32; typedef unsigned short int uvar16; typedef struct { var8 Blue,Green,Red,Reserved;} Palette; int main() { uvar32 Size,Offset,Height,Width,Compress,Reserved, InfoHeaderSize,Colors,ImportantColors,DataSize,HResolution,VResolution; uvar16 Planes,Bit; int i,j; var8 type[2],imdata[256][256]; Palette Rgbquad; ifstream fin; fin.open("cameraman.bmp",ios::binary); /*以二进制读方式打开该文件,一定要二进制的!*/ if(!fin) { cout<<"No this file!\n"; return 1; } fin.read((char*)&type ,2); cout<<"file type: "<<type[0]<<type[1]<<endl; /* 两字节的内容用来识别位图的类型,偏移量 0,结果 file type: BM*/ fin.read((char*)&Size ,sizeof(uvar32)); cout<<"file size: "<<Size<<endl; /*整个文件的大小,偏移量 2,结果 file size: 66614*/ fin.read((char*)&Reserved,sizeof(uvar32)); cout<<"Reserved dword: "<<Reserved<<endl; /*保留,必须设置为 0, 偏移量 6,结果 Reserved dword: 0*/ fin.read((char*)&Offset ,sizeof(uvar32)); cout<<"Offset: "<<Offset<<endl; /*从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 ,偏移量 10,结果 Offset: 1078。位图数据为 256*256, 65536(位图数据)+1078(偏移量)=66614(文件大小)*/ fin.read((char*)&InfoHeaderSize,sizeof(uvar32)); cout<<"Bitmap Info Header Size: "<<InfoHeaderSize<<endl; /*位图信息(Bitmap Info Header)的长度,偏移量 14, 结果 Bitmap Info Header Size: 40*/ fin.read((char*)&Width,sizeof(uvar32)); cout<<"Bitmap Width: "<<Width<<endl; /*位图的宽度,以象素为单位,偏移量 18,Bitmap Width: 256*/ fin.read((char*)&Height,sizeof(uvar32)); cout<<"Bitmap Height: "<<Height<<endl; /*位图的高度,以象素为单位,如果该值是一个正数,说明图像是倒向的, 如果该值是一个负数,则说明图像是正向的。偏移量 22,Bitmap Height: 25 6*/ fin.read((char*)&Planes,sizeof(uvar16)); cout<<"Bitmap Planes: "<<Planes<<endl; /*位图的位面数(注:该值将总是 1),偏移量 26,Bitmap Planes: 1*/ fin.read((char*)&Bit,sizeof(uvar16)); cout<<"Bits per Pixel: "<<Bit<<endl; /*每个象素的位数,偏移量 28,256 色应该 8bit,Bits per Pixel: 8*/ fin.read((char*)&Compress,sizeof(uvar32)); cout<<"Compresssion Y or N: "<<Compr
读取BMP文件位图数据,你可以按照以下步骤进行操作: 1. 打开BMP文件:使用合适的文件读取函数,如`fopen`来打开BMP文件,并确保成功打开文件。 2. 解析BMP文件BMP文件的前14个字节是文件,其中包含了一些关于图像的基本信息,如文件类型、文件大小等。你可以使用结构体来解析文件数据,例如: ```c typedef struct { unsigned short type; // 文件类型 unsigned int size; // 文件大小 unsigned short reserved1; // 保留字段 unsigned short reserved2; // 保留字段 unsigned int offset; // 数据偏移量 } BMPHeader; ``` 使用`fread`函数将文件数据读取到这个结构体中。 3. 解析BMP信息:紧接着文件后面的40个字节是BMP信息,包含了图像的宽度、高度、位深度等信息。同样使用结构体来解析这部分数据,例如: ```c typedef struct { unsigned int size; // 信息大小 int width; // 图像宽度 int height; // 图像高度 unsigned short planes; // 颜色平面数 unsigned short bitCount; // 每个像素的位数 unsigned int compression; // 压缩类型 unsigned int imageSize; // 图像数据大小 int xPixelsPerMeter; // 水平分辨率 int yPixelsPerMeter; // 垂直分辨率 unsigned int colorsUsed; // 使用的颜色数 unsigned int colorsImportant; // 重要颜色数 } BMPInfoHeader; ``` 同样使用`fread`函数将信息数据读取到这个结构体中。 4. 解析位图数据:位图数据紧跟在信息之后,根据位深度的不同,数据解析方式也会有所不同。对于常见的24位真彩色图像,每个像素由红、绿、蓝三个通道组成,每个通道占用一个字节,按照从左到右、从上到下的顺序排列。你可以使用一个二维数组来存储图像的像素数据,例如: ```c unsigned char** imageData = (unsigned char**)malloc(sizeof(unsigned char*) * height); for (int i = 0; i < height; i++) { imageData[i] = (unsigned char*)malloc(sizeof(unsigned char) * width * 3); fread(imageData[i], sizeof(unsigned char), width * 3, file); } ``` 注意,这里假设图像的宽度是4的倍数,如果不是,需要对每行的像素数据进行对齐处理。 5. 关闭文件读取位图数据后,记得关闭文件,释放内存。 以上是读取BMP文件位图数据的基本步骤,你可以根据需要进行进一步处理和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值