C++ bmp文件读写操作

C++数组实验:动态分配数组实现bmp图片翻转图片、缩小图片、灰白处理、读取图片(C实现版本) 动态分配数组实现bmp图片翻转、缩小、灰白处理 目录实验要求:出现的问题源码1.main.cpp2.function.cpp3.function.h4.struct.h 实验要求: 1.动态分配二维数组a,将图像数据“降维”后读入a中。 这里的“降维”指的是把3通道的彩色图像读取到单通道的二维数组中。 2.将数组a的元素上下翻转。即第一行变为最后一行。即实现函数FlipImageUpDown。 3.将数组a的元素左右翻转。即第一列变为最后一列。即实现函数FlipImageLeftRight。 4.将图 阅读详情

bmp文件,总的说来,可以分为以下4个部分

1. 文件头-----FILE_HEADER (总共14个字节)

2. 信息头-----INFO_HEADER  (总共40个字节)

3. 调色板----PALLET (单通道灰度图像才有,真彩色3通道图像没有)

4. 图像数据---IMAGE_DATA (实际图象像素数据)


bmp位图文件读写和显示到指定控件api简单封装,下面给出了封装源码的链接地址,欢迎大家一起交流,共同进步。

下载链接:http://download.youkuaiyun.com/detail/cimage/6610213


分别基本结构定义如下:

1. 文件头

struct tagBmpFileHeader //文件头
{
	unsigned short bfType;		//标识该文件为bmp文件,判断文件是否为bmp文件,即用该值与"0x4d42"比较是否相等即可,0x4d42 = 19778
	unsigned long  bfSize;		//文件大小
	unsigned short bfReserved1;	//预保留位
	unsigned short bfReserved2;	//预保留位
	unsigned long  bfOffBits;	//图像数据区的起始位置
}BmpFileHeader;//14字节
2. 信息头

struct tagBmpInfoHeader //信息头
{
	unsigned long  biSize;	//图像数据大小
	long     biWidth;	//宽度
	long     biHeight;	//高度
	unsigned short biPlanes;//为1
	unsigned short biBitCount; //像素位数,8-灰度图;24-真彩色
	unsigned longbiCompression;//压缩方式
	unsigned longbiSizeImage;  //图像区数据大小
	long     biXPelsPerMeter;  //水平分辨率,像素每米
	long     biYPelsPerMeter;
	unsigned long biClrUsed;   //位图实际用到的颜色数
	unsigned short biClrImportant;//位图显示过程,重要的颜色数;0--所有都重要
}BmpInfoHeader;//40字节
3. 调色板

struct tagRGBPallete //调色板
{
	unsigned char b;
	unsigned char g;
	unsigned char r;
	unsigned char alpha; //预保留位
}RGBPallete;

4. 定义一个图像结构

typedef struct tagVImage
{
	int width;
	int height;
	int channels;
	unsigned char* data;
}VImage;

5. bmp图像读取

VImage* LoadBMP(const char* filename)
{
	VImage* tempImage = (VImage*)malloc(sizeof(VImage));

	ULONGLONG position = 0;//文件中内容地址

	int szBmpFileHeader = 0, szBmpInfoHeader = 0, szRGBPallete = 0, szTemp = 0; 

	int width = 0, height = 0, nChannels = 0, widthStep = 0, index = 0;

	unsigned char* dataBuff = NULL;

	CFile bmpFile;

	if (!bmpFile.Open(filename, CFile::modeRead | CFile::shareDenyWrite))
		return NULL;

	szBmpFileHeader = sizeof(BmpFileHeader);
	szBmpInfoHeader = sizeof(BmpInfoHeader);
	szRGBPallete    = sizeof(RGBPallete);

	BmpFileHeader* pFileHeader = (BmpFileHeader*)malloc(szBmpFileHeader);

	szTemp = bmpFile.Read(pFileHeader, szBmpFileHeader); //文件头读取完毕

	position = bmpFile.Seek(szBmpFileHeader, CFile::begin); //跳转到文件头后地址处

	if (szTemp != szBmpFileHeader)
		return NULL;

	if (pFileHeader->bfType != 0x4d42)// 0x4d42 = 19778
		return NULL;

	BmpInfoHeader* pInfoHeader = (BmpInfoHeader*) malloc(szBmpInfoHeader);

	bmpFile.Read(pInfoHeader, szBmpInfoHeader); //信息头读取完毕

	position = bmpFile.Seek(szBmpInfoHeader + position, CFile::begin);//跳转到信息头后

	width = pInfoHeader->biWidth;
	height = pInfoHeader->biHeight;

	width = ((width + 3) >> 2) << 2;

	if (8 == pInfoHeader->biBitCount)//灰度图
	{
		RGBPallete* pRGBPallete = (RGBPallete*) malloc(256 * szRGBPallete);

		bmpFile.Read(pRGBPallete, 256 * szRGBPallete);//灰度图,读取调色板完毕

		position = bmpFile.Seek(256 * szRGBPallete + position, CFile::begin);

		nChannels = 1;
		widthStep = width;

		tempImage->width = width;
		tempImage->height = height;
		tempImage->channels = nChannels;

		tempImage->data = (unsigned char*) malloc(width * height);

		dataBuff = (unsigned char*) malloc(width * height);
		memset(dataBuff, 0, width * height);

		//bmpFile.Read(tempImage->data, width * height);//图像实际数据读取完毕
		bmpFile.Read(dataBuff, width * height);//图像实际数据读取完毕

		for (index = 0; index < height; index++)//bmp数据分布格式
		{
			memcpy(tempImage->data + index * width, dataBuff + (height - 1 - index) * width, width);
		}

		free(pFileHeader);
		free(pInfoHeader);
		free(pRGBPallete);
		free(dataBuff);

		pFileHeader = NULL;
		pInfoHeader = NULL;
		pRGBPallete = NULL;
		dataBuff = NULL;

		bmpFile.Close();//关闭文件

		return tempImage;
	}
	else if (24 == pInfoHeader->biBitCount) // 真彩色
	{
		nChannels = 3;
		widthStep = width * 3;

		tempImage->width = width;
		tempImage->height = height;
		tempImage->channels = nChannels;

		tempImage->data = (unsigned char*) malloc(widthStep * height);
		dataBuff = (unsigned char*) malloc(widthStep * height);

		//bmpFile.Read(tempImage->data, widthStep * height);
		bmpFile.Read(dataBuff, widthStep * height);

		for (index = 0; index < height; index++)//bmp数据分布格式为左下角到右上角,因此转换一下。
		{
			memcpy(tempImage->data + index * widthStep, dataBuff + (height - 1 - index) * widthStep, widthStep);
		}

		free(pFileHeader);
		free(pInfoHeader);
		free(dataBuff);

		dataBuff = NULL;
		pFileHeader = NULL;
		pInfoHeader = NULL;

		bmpFile.Close();

		return tempImage;
	}
	return NULL;
}

读取BMP文件并显示出来(C++实现) 读取BMP文件的时候我们首先需要弄清楚bmp格式文件的结构 bmp的文件格式 bmp文件包含在windows.h的头文件里。编写代码的时候可以直接调用Windows.h 头文件来调用。 阅读详情

相关推荐

BitMap的读写与修改

位图(BitMap)是一种非常常见的图像类型,而且因为其失真率低,所以在机器视觉中经常会使用到它,因此需要对BitMap有更深一步的认识。 BitMap总的来说分为四个结构:位图文件头结构、位图信息头结构、颜色表和位图数据。 其中,位图文件头结构存储的是对图像文件类型的声明等规定化的内容,位图信息头结构则存储了关于位图的一些相关信息,颜色表是只在灰度位图文件中存在(彩色bmp图像中不存在颜色表),其表示位图灰度值的索引以及对应值,位图数据是存放真正图像数据的内存区。 下面通过C++实现对BitMap的读写与

邱小兵的博客 1683

C++实现bmp文件的读写

C++实现BMP文件读写

ting 2081

使用C++在VC6.0中实现BMP图像文件的读写操作

本文还有配套的精品资源,点击获取 简介:本文详细说明了如何利用C++语言在VC6.0开发环境下读取和保存BMP格式图像文件。BMP格式以其无损特性和对原始图像数据的直接访问性而广泛使用。我们将探讨BMP文件头的结构,包括文件头(BITMAPFILEHEADER)和位图信息头(BITMAPINFOHEADER)的组成以及它们在图像处理中的重要性。此外,文章将提供读取和写入BM...

weixin_36078669的博客 1099

c++读取bmp图片详解

先介绍几个会用到的函数。 1、FILE * fopen(const char * path,const char * mode); path是字符串类型的bmp图片路径;mode读取方式,等下回用到"rb",读写打开一个二进制文件,允许读写数据,文件必须存在。 2、int fseek(FILE *stream, long offset, int fromwhere); 函数设置文件

u013509299的专栏 2万+

纯C++实现BMP图像读写与OpenCV集成实战

BMP图像文件的结构由多个固定长度的头部信息块组成,其中最重要的两个结构体是和,它们分别用于描述文件的基本信息和图像的详细属性。在C++中,通过结构体定义可以将这些头部信息映射到内存中,便于程序解析和操作。此外,调色板(RGBQUAD)和颜色掩码(Bitmask)也是位图文件中不可忽视的部分,尤其在处理1位、4位、8位等低色彩深度的图像时尤为重要。紧随出现,描述了图像的详细信息,如宽度、高度、颜色深度等。其定义如下:// 本结构体的大小,通常为40// 图像宽度(像素)

weixin_35829279的博客 1039

离线安装ambari 更换spark版本 集成carbondate文档

1、Linux系统环境配置 1.1 配置IP地址 vim /etc/sysconfig/network-script/ifcfg-eth0 “DEVICE”:网卡对应的设备别名,如ifcfg-eth0第一块网卡; “HWADDR”:网卡物理地址; “BOOTPROTO”:网卡获得ip地址的方式,Static(静态 ip地址)dhcp(通过dhcp协议获取ip)bootip通过boot...

weixin_44742962的博客 3036

C++读写BMP文件

BMP文件格式组成部分:bmp文件头(14个字节) + 位图信息头(40个字节) + 调色板(由颜色索引数决定) + 位图数据(由图像尺寸决定)位图文件头BITMAPFILEHEADER位图信息头BITMAPINFOHEADER调色板Palette(可选)实际的位图数据ImageDate第一部分为位图文件头指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。指定文件大小,包括这14个字节。保留字,不用考虑保留字,不用考虑。

mickey2007的博客 2890

把STM32MP135当单片机玩:实战SD卡脱机运行LED程序(基于MP135DK开发板)

本文详细介绍了如何在STM32MP135开发板上实现SD卡脱机运行LED程序,通过裸机开发方式(Bare Metal)利用HAL库完成GPIO控制,并解析了SD卡启动流程。内容涵盖工程创建、代码编写、SD卡烧录及常见问题排查,为开发者提供了一种高性能单片机开发方案。

weixin_33734785的博客 242

bmp文件头_图像算法原理与实践——图像文件存储

图像数据在计算机储器设备中的存储形式是图像文件,图像必须按照某个公开的、规范约终结定的数据存储顺序和结构进行保存,才能使不同的程序对图像文件顺利进行打开或存盘操作,实现数据共享。图像数据在文件中的存储顺序和结构称为图像文件格式。目前主流的图像文件格式有 .bmp; .jpg;.jpeg;.png;.gif;.webp;.tiff;.psd 等各种不同的文件格式。在这些图像格式中大部分的格...

weixin_39756273的博客 2865

用C++手把手教你连接SimNow期货模拟盘:从CTP API封装到第一个订单(附完整代码)

本文详细介绍了如何使用C++连接SimNow期货模拟盘,从CTP API的基础架构解析到实现第一个订单的完整流程。内容涵盖CTP API的封装、SimNow环境配置、交易通道实现、行情接收与处理等核心环节,并提供完整代码示例,帮助开发者快速掌握量化交易中的期货模拟盘连接技术。

weixin_27215337的博客 330

电网渗透之终端安全

        电力系统安全不仅关系到电网的稳定运行,也关系到国家能源安全和国计民生,甚至关系到国家的安全和利益,电力系统由于结构复杂多样、分布广泛、重要性高,一旦系统瘫痪影响巨大,因此,极容易成为敌对势力攻击的首选目标。随着信息安全暴露面迅速增加,将给公司网络安全防线带来严峻挑战。       监控、保障这些电力系统安全运行变的尤为重要。内部安全防护产品有防火墙、纵向加密、反向隔离设备等...

guapi007008的博客 2722

BMP Header Structure

1 /* ***** BEGIN LICENSE BLOCK ***** 2 * 3 * $Id: bitmap.h,v 1.3 2004/06/30 16:44:52 asuraparaju Exp $ $Name: Dirac_1_0_2 $ 4 * 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 6 * ...

aomianyang7233的博客 198

巨量千川M-API实战:5分钟搞定短视频计划数据自动获取(Python版)

本文详细介绍了如何利用巨量千川M-API和Python快速搭建自动化工具,实现短视频计划数据的自动获取。通过实战代码演示了从环境准备、Token管理到核心数据接口调用的完整流程,帮助电商运营和技术开发者告别手动导出,高效完成数据汇总与分析。

weixin_29325515的博客 1362

BMP文件的读入与存盘

1.BMP文件的读入 BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进行处理,即先处理BITMAPFILEHEADER结构,然后是BITMAPINFOHEADER结构、颜色表,最后是位图数据。 首先,有关BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD等结构的定义包含在头文件“Windows.h”中,应把其包含进来。 #includ...

海月的博客 1467

告别环境配置烦恼:用Conda一键搞定GATK4、samtools、fastp等生信分析全家桶

本文介绍如何利用Conda快速搭建包含GATK4、samtools、fastp等工具的生物信息学分析环境,解决软件安装和版本冲突问题。通过详细的配置步骤和实战案例,帮助研究者十分钟内完成重测序分析全家桶的环境配置,显著提升上游分析效率。

weixin_30753873的博客 335

机器学习实战——疫情数据分析与预测

机器学习如何做到疫情可视化——疫情数据分析与预测实战 本文将带领大家爬取11个国家以及中国31个省(自治区、直辖市)在2022.0101-2022.06.19的新冠疫情数据。并且采用机器学习模型对2022.6.20-2022.6.30每一天的全国确诊人数、死亡人数、治愈人数进行预测,**做出疫情可视化图形并且求出最终的相关系数R2!...

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 10万+

BMP图像的读写处理

最近一段时间我学习了计算机图像处理这门课程,通过这门课程的学习,我了解到了图片具有灰度和彩色的区别,并且通过具体的代码可以将一些图片数据进行读写与转化。 第一部分:BMP图像的读写 1.BMP图像的读: (1)首先定义BMP文件头和信息头变量BITMAPFILEHEADER bf; //BMP文件头结构体BITMAPINFOHEADER bi; //BMP信息头结构体 (2)创建文件输入流 fp fp=fopen(fileName,“rb”); //fileName为BMP图像文件名 (3)读取信息.

zzjjqq666的博客 6341

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VS2010 C++学习(2):BMP图像文件的处理

VS2010 C++学习(2):BMP图像文件的处理   学习VC++编制的BMP图像文件的处理程序.。 一、          主要内容: 1.       BMP图像文件的结构分析; 2.       BMP图像文件的读写; 3.       BMP图像文件的置固定值处理、反色处理、平滑处理;   二、          设计实现:   1.       BMP图像文件的结

dalong10的专栏 4408

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c语言 bmp加水印,[求助]C语言 bmp文件加上水印

该楼层疑似违规已被系统折叠隐藏此楼查看此楼给一张图片加水印后存起来然后显示出来有部分源码 求高手帮忙完成~!#include#include/* structure defiens bitmap header */struct BITMAPFILEHEADER{unsigned short type;/* type of file (bit map) */unsigned long size;/...

weixin_39815600的博客 117

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

c++ 读写BMP

BMP文件读写 SkySeraph Mar 10th 2011  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified Date:Mar 10th 2011 HQU 第一步,包含头文件,定义全局变量 #include "Windows.h"   //包含有关BITMAPFILEHEADER、BITMA

ngw418的专栏 503

Bmp读取&&保存&&旋转&&加密&&加密后信息提取(LSB算法)

#include #include #include #include #include #include using namespace std; char buf[51200000]; typedef struct tagIMAGEDATA {     BYTE blue;     BYTE green;     BYTE red; }IMAGEDATA; BIT

ZWenLong520的博客 334

c语言bmp位图读入,c语言 bmp位图差分

该楼层疑似违规已被系统折叠隐藏此楼查看此楼做两个bmp图片的差分,并新建一个bmp图,将差分的结果存入新建的位图中.程序如下,#include #include typedef unsigned short WORD;typedef unsigned long DWORD;typedef long LONG;typedef unsigned char BYTE;typedef struct BI...

weixin_31222161的博客 94

c语言在bmp图片上写字的函数,在bmp上写字

1、如何在bmp上写字,画画等2、C++文件读写3、如何取得桌面、开始菜单等特殊位置路径4、C++多态的分类重载多态,强制多态,包含多态,参数多态。普通函数和类的成员函数的重载属于重载多态,还有运算符重载。强制多态包括类型强制转换等。包含多态主要通过虚函数来实现。参数多态和类模板相关。5、C运行时的本地化setlocale:函数原形为:char *setlocale( int category, ...

weixin_39715348的博客 921
上一篇: 内存泄露检测
下一篇: 征服C指针之数组和指针的微妙关系
WTK-CV
博客等级 码龄16年 48粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值