读入bmp格式图像文件

计算机的图片有多种格式,比如jpg,png,gif,bmp等。

其中bmp是无压缩的位图图像文件。

下图是一张100*100像素的小狗位图图像。


在计算机中,这张小狗图像以如下的二进制形式存放。


位图文件所对应的二进制文件信息包含三部分:文件头+信息头+数据区

文件头:

typedef struct tagBITMAPFILEHEADER {
WORD           bfType;
DWORD bfSize;
WORD           bfReserved1;
WORD           bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER; 

信息头:

typedef struct tagBITMAPINFOHEADER{
DWORD  biSize;
LONG            biWidth;
LONG            biHeight;
WORD           biPlanes;
WORD           biBitCount;
DWORD  biCompression;
DWORD  biSizeImage;
LONG            biXPelsPerMeter;
LONG            biYPelsPerMeter;
DWORD  biClrUsed;
DWORD  biClrImportant;
} BITMAPINFOHEADER;

数据区:

数据区保存着点阵图像(位图)各点的颜色信息。

一般是三个字节保存一个像素点的信息。三个字节分别为某点颜色信息的和红绿蓝(RGB)分量,因为不同比例的红绿蓝可以杂凑出所有颜色。


写一个类DMPC,用来解析dmp位图图像:

DMPC.h

#pragma once
 //位图文件头
typedef struct tagBITMAPFILEHEADER {
WORD           bfType;
DWORD bfSize;
WORD           bfReserved1;
WORD           bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
 //位图信息头
typedef struct tagBITMAPINFOHEADER{
DWORD  biSize;
LONG            biWidth;
LONG            biHeight;
WORD           biPlanes;
WORD           biBitCount;
DWORD  biCompression;
DWORD  biSizeImage;
LONG            biXPelsPerMeter;
LONG            biYPelsPerMeter;
DWORD  biClrUsed;
DWORD  biClrImportant;
} BITMAPINFOHEADER;
 //dmp class,位图解析类
class DMPC
{
public:
	BITMAPFILEHEADER file_head;
	BITMAPINFOHEADER info_head;
	
	unsigned char *pBmpBuf;//读入图像数据的指针
	float *pBmpBuff;//读入图像数据的指针
	int bmpWidth;//图像的宽
	int bmpHeight;//图像的高
	RGBQUAD *pColorTable;//颜色表指针
	int biBitCount;//图像类型,每像素位数
	
	DMPC(void);
	~DMPC(void);
	int read_pic(CString m_path);//传入位图文件地址,并解析图像
};

DMPC.cpp文件,visual studio的类,添加了StdAfx.h的头文件

#include "StdAfx.h"
#include "DMPC.h"
DMPC::DMPC(void)
{
}
DMPC::~DMPC(void)
{
}
int DMPC::read_pic(CString m_path)
{
	FILE *fp = fopen(m_path,"rb");
	if (fp == NULL)
		return -1;
	//跳过文件头
	fseek(fp, sizeof(BITMAPFILEHEADER),0);
	//读入信息头
	BITMAPINFOHEADER head;
	fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
	//解析信息头得到一些关键信息
	bmpWidth = head.biWidth;
    bmpHeight = head.biHeight;
    biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
    int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256
    if(biBitCount==8)
	{
        //申请颜色表所需要的空间,读颜色表进内存
        pColorTable=new RGBQUAD[256];
        fread(pColorTable,sizeof(RGBQUAD),256,fp);
	}
    //申请位图数据所需要的空间,读位图数据进内存
    pBmpBuf = new unsigned char[lineByte * bmpHeight];
    pBmpBuff = new float[lineByte * bmpHeight];
	fread(pBmpBuf,1,lineByte * bmpHeight,fp);
	//解析点阵图像数据
    int h = bmpHeight;
	int w = bmpWidth;
	for (int i = 0; i< h; i++)
	{
		for (int j = 0; j< w; j++)
		{
			int b = pBmpBuf[i*3*w + j*3];
			int g = pBmpBuf[i*3*w + j*3 + 1];
			int r = pBmpBuf[i*3*w + j*3 + 2];
			pBmpBuff[i*3*w + j*3] = b/255.0;
			pBmpBuff[i*3*w + j*3 +1] = g/255.0;
			pBmpBuff[i*3*w + j*3 +2] = r/255.0;
			//dcMem.SetPixel(j,h-i,RGB(r,g,b));    
		}
	}
	fclose(fp);//关闭文件
    return 1;//读取文件成功
}
这里有个auto-encode的VC工程文件,里面有对这个类的简单使用:



电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值