c语言 图片.bmp读写示例

1 图片.bmp数据结构

BMP(Bitmap)文件格式是一种简单的位图图像格式,其数据结构分为几个主要部分:文件头、信息头、调色板(可选)和像素数据。下面是各部分的详细说明。

  1. 文件头(File Header)
bfType (2 bytes): 文件类型,通常为'BM'0x42 0x4D)。
bfSize (4 bytes): 文件大小(以字节为单位)。
bfReserved1 (2 bytes): 保留字,通常为0bfReserved2 (2 bytes): 保留字,通常为0bfOffBits (4 bytes): 从文件头到像素数据的偏移量。
  1. 信息头(DIB Header)
biSize (4 bytes): 信息头的大小(通常为40)。
biWidth (4 bytes): 图像宽度(以像素为单位)。
biHeight (4 bytes): 图像高度(以像素为单位)。
biPlanes (2 bytes): 色平面数,通常为1biBitCount (2 bytes): 每个像素的位数(如24位、32位)。
biCompression (4 bytes): 压缩类型(0为不压缩)。
biSizeImage (4 bytes): 图像数据的大小(可以为0)。
biXPelsPerMeter (4 bytes): 水平分辨率(像素每米)。
biYPelsPerMeter (4 bytes): 垂直分辨率(像素每米)。
biClrUsed (4 bytes): 使用的颜色数(0表示使用所有颜色)。
biClrImportant (4 bytes): 重要的颜色数(0表示所有)。
  1. 调色板(Color Palette)
    对于某些格式(如1位或4位色),可能会包含调色板。调色板由颜色索引组成,使用RGB格式(每个颜色占用4个字节,包含蓝、绿、红、保留字节)。

  2. 像素数据(Pixel Data)
    像素数据从bfOffBits指定的位置开始。像素的排列顺序通常是自下而上,从左到右,具体存储格式取决于biBitCount:

24位BMP:每个像素使用3个字节,分别表示蓝色、绿色和红色(BGR格式)。
32位BMP:每个像素使用4个字节(蓝、绿、红、透明度)。

在C语言中,BMP文件格式有一个特定的数据结构。BMP文件分为文件头、信息头和像素数据。下面是BMP文件的基本数据结构:

BMP 文件数据结构

#include <stdint.h>// BMP 文件头
typedef struct {uint16_t bfType;      // 文件类型,通常为 'BM'uint32_t bfSize;      // 文件大小uint16_t bfReserved1; // 保留字段uint16_t bfReserved2; // 保留字段uint32_t bfOffBits;   // 像素数据的偏移量
} BMPFileHeader;

// BMP 信息头

typedef struct {uint32_t biSize;          // 信息头大小int32_t biWidth;          // 图像宽度int32_t biHeight;         // 图像高度uint16_t biPlanes;        // 色平面数,通常为1uint16_t biBitCount;      // 每个像素的比特数(如24位)uint32_t biCompression;   // 压缩类型uint32_t biSizeImage;     // 图像大小int32_t biXPelsPerMeter;   // 水平分辨率int32_t biYPelsPerMeter;   // 垂直分辨率uint32_t biClrUsed;       // 使用的颜色数uint32_t biClrImportant;   // 重要的颜色数
} BMPInfoHeader;

// 像素数据

typedef struct {uint8_t blue;    // 蓝色分量uint8_t green;   // 绿色分量uint8_t red;     // 红色分量
} RGBPix

2 解析 BMP 文件步骤

打开 BMP 文件:

FILE *file = fopen("image.bmp", "rb");
if (!file) {perror("Unable to open file");return;
}

读取文件头:

BMPFileHeader fileHeader;
fread(&fileHeader, sizeof(BMPFileHeader), 1, file);

读取信息头:

BMPInfoHeader infoHeader;
fread(&infoHeader, sizeof(BMPInfoHeader), 1, file);

读取像素数据:
根据 infoHeader.biWidth 和 infoHeader.biHeight 读取像素数据。

int row_padded = (infoHeader.biWidth * 3 + 3) & (~3); // 行填充到4的倍数
RGBPixel *pixels = malloc(infoHeader.biWidth * infoHeader.biHeight * sizeof(RGBPixel));for (int i = 0; i < infoHeader.biHeight; i++) {fread(pixels + (infoHeader.biHeight - i - 1) * infoHeader.biWidth, sizeof(RGBPixel), infoHeader.biWidth, file);fseek(file, row_padded - infoHeader.biWidth * 3, SEEK_CUR);
}

关闭文件:
fclose(file);
注意事项
BMP文件通常以蓝色、绿色、红色(BGR)顺序存储像素。
图片数据行通常是4字节对齐,可能需要填充字节。
确保检查文件类型以确认它是一个合法的BMP文件。

3 c语言 .bmp图像读写示例

#include <stdio.h>
#include <stdlib.h>#define BUF_SIZE 720*1280*3
#define IMG_NAME "fengjing720.bmp"
#define IMG_NEW "x1.bmp"#pragma pack(push, 1) // 让结构体按照1字节对齐,确保读写顺序正确
typedef struct {unsigned short bfType;      // 文件类型unsigned int bfSize;        // 文件大小unsigned short bfReserved1; // 保留字unsigned short bfReserved2; // 保留字unsigned int bfOffBits;     // 像素数据偏移
} BITMAPFILEHEADER;typedef struct {unsigned int biSize;          // 信息头大小int biWidth;                  // 图像宽度int biHeight;                 // 图像高度unsigned short biPlanes;      // 平面数unsigned short biBitCount;    // 每个像素的位数unsigned int biCompression;    // 压缩类型unsigned int biSizeImage;      // 图像大小int biXPelsPerMeter;          // 水平分辨率int biYPelsPerMeter;          // 垂直分辨率unsigned int biClrUsed;       // 使用的颜色索引unsigned int biClrImportant;  // 重要的颜色索引
} BITMAPINFOHEADER;
#pragma pack(pop)BITMAPFILEHEADER bfHeader;
BITMAPINFOHEADER biHeader;void readBMP(const char *filename,unsigned char *data,int size) {FILE *file = fopen(filename, "rb");if (!file) {perror("Failed to open file");return;}// BITMAPFILEHEADER bfHeader;// BITMAPINFOHEADER biHeader;fread(&bfHeader, sizeof(bfHeader), 1, file);fread(&biHeader, sizeof(biHeader), 1, file);if (bfHeader.bfType != 0x4D42) {printf("Not a BMP file.\n");fclose(file);return;}printf("Width: %d, Height: %d Offset:%d\n", biHeader.biWidth, biHeader.biHeight,bfHeader.bfOffBits);// 移动到像素数据部分fseek(file, bfHeader.bfOffBits, SEEK_SET);// 计算像素数据大小//*size = biHeader.biWidth * biHeader.biHeight * 3; // 24位RGB//unsigned char *data = (unsigned char *)malloc(imageSize);if (!data) {printf("Memory allocation failed\n");fclose(file);return;}fread(data, 1,size, file);fclose(file);// 处理像素数据(例如,打印第一个像素的RGB值)printf("First pixel RGB: (%d, %d, %d)\n", data[0], data[1], data[2]);//free(data);
}void writeBMP( const char *filename,unsigned char *data,int size)
{FILE *file = fopen(filename, "wb");if (!file) {perror("Unable to create file");return;}// 写入文件头和信息头fwrite(&bfHeader, sizeof(bfHeader), 1, file);fwrite(&biHeader, sizeof(biHeader), 1, file);// 写入像素数据fwrite(data, 1,size, file);fclose(file);
}int main() {char img_buf[BUF_SIZE];readBMP(IMG_NAME,img_buf,BUF_SIZE);printf("Width: %d, Height: %d Offset:%d\n", biHeader.biWidth, biHeader.biHeight,bfHeader.bfOffBits);writeBMP(IMG_NEW,img_buf,BUF_SIZE);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403251.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东晟时尚服饰文化传承与发展研发中心成立

近期&#xff0c;东晟时尚创新科技&#xff08;北京&#xff09;有限公司宣布成立东晟时尚服饰文化传承与发展研发中心&#xff0c;此举标志着公司在促进中国传统文化与现代时尚产业结合方面迈出了关键步伐。 作为一家在时尚科技推广和设计研发应用服务领域具有战略眼光的企业&…

【问题记录+总结】VS Code Tex Live 2024 Latex Workshop Springer模板----更新ing

目录 Summary 道阻且长 少即是多 兵马未动粮草先行 没有万能 和一劳永逸 具体问题具体分析 心态 Detail 1、关于模板[官网] 2、settings.json 3、虫和杀虫剂 4、擦 换成Tex Studio都好了。。。 Summary 道阻且长 某中意期刊&#xff0c;只有Latex。之前只简单用过…

部署 K8s 图形化管理工具 Dashboard

文章目录 一、Dashboard 概述二、GitHub 地址三、Dashboard 部署安装1、选择兼容版本2、下载配置文件3、添加 Dashboard 的Service类型4、应用部署5、查看 kubernetes-dashboard 命名空间下资源状态6、创建访问账户7、授权8、获取账号token9、1.24 版本以后的需要创建一个Pod 四…

C++ 11相关新特性(lambda表达式与function包装器)

目录 lambda表达式 引入 lambda表达式介绍 lambda表达式捕捉列表的传递形式 lambda表达式的原理 包装器 包装器的基本使用 包装器与重载函数 包装器的使用 绑定 C 11 新特性 lambda表达式 引入 在C 98中&#xff0c;对于sort函数来说&#xff0c;如果需要根据不同的比较方式实现…

自闭症青年的行为特征有哪些

自闭症&#xff0c;又称孤独症&#xff0c;是一种神经发育障碍&#xff0c;它不仅影响儿童的成长&#xff0c;也会在青年时期展现出一系列独特的行为特征。了解这些特征对于更好地支持和帮助自闭症青年融入社会至关重要。 社交互动方面的困难是自闭症青年较为显著的特征之一。他…

Kubectl 常用命令汇总大全

kubectl 是 Kubernetes 自带的客户端&#xff0c;可以用它来直接操作 Kubernetes 集群。 从用户角度来说&#xff0c;kubectl 就是控制 Kubernetes 的驾驶舱&#xff0c;它允许你执行所有可能的 Kubernetes 操作&#xff1b;从技术角度来看&#xff0c;kubectl 就是 Kubernetes…

openEuler系统安装Visual Studio Code

openEuler系统安装Visual Studio Code 背景安装密钥和存储库更新包缓存并使用dnf安装包Fedora 22及以上版本旧版本使用yum 安装过程截图安装成功看桌面效果 背景 openEuler(openEuler-24.03-LTS)安装了麒麟UKUI桌面但是没有麒麟软件商店想安装Visual Studio Code 安装密钥和…

专业剪辑新选择!2024年TOP榜达芬奇剪辑软件VS三大劲敌的较量

到了2024年&#xff0c;科技飞快地进步&#xff0c;视频剪辑这一块儿也变了不少。老的剪辑方法一直被刷新&#xff0c;新的软件一个接一个冒出来&#xff0c;像达芬奇剪辑软件这样的&#xff0c;都成了拍视频的人的好伙伴。咱们今天就来聊聊这几款软件有啥神奇的&#xff0c;比…

安全基础学习-RC4加密算法

这里仅仅记录一些基础的概念。后期有需求进一步扩展。 RC4 是一种对称流加密算法&#xff0c;由罗恩里维斯特&#xff08;Ron Rivest&#xff09;于1987年设计。RC4 的设计目的是提供一种简单且高效的加密方法。尽管 RC4 曾经广泛使用&#xff0c;但它的安全性在现代已受到质疑…

Modbus 通信协议详解

目录 一、概述二、Modbus 的作用三、Modbus 的工作原理1、四种数据类型2、三种工作模式3、三类功能码3.1 标志功能码3.2 Modbus 封装接口3.3 异常 4、Modbus 协议层4.1 协议数据单元4.2 访问数据4.3 数据模型寻址4.3.1 数据寻址范围4.3.2 数据地址起始值 4.4 大数据类型4.4.1 位…

Java面试题———分布式篇

目录 1、什么是分布式事务 2、什么是CAP理论 3、为什么分布式系统中无法同时AC 4、什么是BASE理论 5、分布式事务的解决方案有哪些 6、Seata的架构是什么 7、XA模式的工作流程是什么 8、AT模型的工作原理是什么 9、TCC模型的工作原理是什么 1、什么是分布式事务 在分…

java:实现简单的验证码功能

效果 实现思路 验证码图片的url由后端的一个Controller生成&#xff0c;前端请求这个Controller接口的时候根据当前时间生成一个uuid&#xff0c;并把这个uuid在前端使用localStorage缓存起来&#xff0c;下一次还是从缓存中获取。 Controller生成验证码之后&#xff0c;把前…

spring-boot-3.2.6+spring-security-6.2.4+oauth2整合github示例

一、添加依赖 在 pom.xml 中添加如下依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

【GD32】从零开始学GD32单片机 | PMU电源管理单元+深度睡眠和待机例程(GD32F470ZGT6)

1. 简介 PMU电源管理单元通俗讲就是用来管理MCU的电源域的&#xff0c;它主要有两个功能——电压监测和低功耗管理。在GD32中一共有3个电源域——VDD/VDDA域、1.2V域和备份域。 VDD/VDDA域主要供PMU控制器、ADC、DAC等外设使用&#xff1b;1.2V域就是大部分外设都会使用的电源域…

西安电子科技大学萌新智慧指南(校区篇)

本次是西安电子科技大学南校区【本部南校区】 刚刚进入校园 相信大家对校园环境还很陌生 接下来就用一张地图 带大家迅速了解一下南校区的构造 宿舍 学生宿舍主要分为三部分 竹园公寓 1-4 海棠公寓 5-10 丁香公寓 11-15 研究生们主要居住在 海棠续建5、丁香14、丁香1…

24年日语能力(JLPT)考试报名流程图解

报名方式 搜索JLPT中国教育考试网&#xff0c;在线报名&#xff0c;一般学生党从教育网入口登录&#xff0c;社会人士从公网入口登录 报名时间 N1-N5 8月20日 7:00 - 8月27日14:00 注册时间 8月13日7:00 - 8月27日14:00 报名步骤 阅读报考提示&#xff0c;注册个人信息→…

C++适配windows和linux下网络编程TCP简单案例

C网络编程 网络协议是计算机网络中通信双方必须遵循的一套规则和约定&#xff0c;用于实现数据的传输、处理和控制。这些规则包括了数据格式、数据交换顺序、数据处理方式、错误检测和纠正等。网络协议是使不同类型的计算机和网络设备能够相互通信的基础&#xff0c;是网络通信…

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…

HarmonyOS NEXT - 通过 module 模块化引用公共组件和utils

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT 一、HAP & HSP & HAR介绍HAP官方介绍HAR官方介绍HSP官方介绍怎么理解App、HAP、HAR的关系HAR如何转换为HSPHSP模块如何快速切换成HAR模块 二…

PDF转markdown工具:magic-pdf

1. magic-pdf 环境安装 conda create -n MinerU python3.10 conda activate MinerU pip install boto3>1.28.43 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install magic-pdf[full]0.7.0b1 --extra-index-url https://wheels.myhloli.com -i https://pypi.tuna.t…