C语言读取BMP文件头、信息头及像素信息

C语言读入bmp图像 图像高度(4字节):以像素为单位,表示图像的高度。如果为正值,图像是正向的(从上到下),如果为负值,图像是反向的(从下到上)。对于24位真彩色的BMP图像,图像数据部分以蓝色、绿色和红色的顺序依次表示一个像素的颜色,每个颜色通道占用1字节。- 图像数据大小(4字节):以字节为单位,表示图像数据的大小。- 使用的颜色数(4字节):通常为0,表示使用所有可能的颜色。- 重要的颜色数(4字节):通常为0,表示所有颜色都是重要的。- 图像宽度(4字节):以像素为单位,表示图像的宽度。 阅读详情

本学期的实验之一,看网上许多文章关于读取像素的处理并不是很完整,就放上来一个。

/*****************************************************
 * usage:<BMP file><r output><g output><b output><copy file>
 *****************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short int WORD;
typedef unsigned int DWORD;
typedef unsigned char BYTE;

typedef struct tagBITMAPFILEHEADER
{
    WORD bfType; // 位图文件的类型,必须为BM(0-1字节)
    DWORD bfSize;  // 位图文件的大小,以字节为单位(2-5字节)
    WORD bfReserved1;  // 位图文件保留字,必须为0(6-7字节)
    WORD bfReserved2;  // 位图文件保留字,必须为0(8-9字节)
    DWORD bfOffBits;  // 位图数据的起始位置(10-13字节),以相对于
    // 位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;  // 本结构所占用字节数(14-17字节)
    DWORD biWidth;  // 位图的宽度,以像素为单位(18-21字节)
    DWORD biHeight;  // 位图的高度,以像素为单位(22-25字节)
    WORD biPlanes;  // 目标设备的级别,必须为1(26-27字节)
    WORD biBitCount;  // 每个像素所需的位数,必须是1(双色),(28-29字节)
    // 4(16色),8(256色)或24(真彩色)之一
    DWORD biCompression;  // 位图压缩类型,必须是 0(不压缩),(30-33字节)
    // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    DWORD biSizeImage;  // 位图的大小,以字节为单位(34-37字节)
    DWORD biXPelsPerMeter;  // 位图水平分辨率,每米像素数(38-41字节)
    DWORD biYPelsPerMeter;  // 位图垂直分辨率,每米像素数(42-45字节)
    DWORD biClrUsed;  // 位图实际使用的颜色表中的颜色数(46-49字节) 设为0的话,则说明使用所有调色板项,即2 biBitCount种颜色
    DWORD biClrImportant; // 位图显示过程中重要的颜色数(50-53字节)
}BITMAPINFOHEADER;

typedef struct tagRGBQUAD
{
	BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)
	BYTE rgbGreen;  // 绿色的亮度(值范围为0-255)
	BYTE rgbRed;  // 红色的亮度(值范围为0-255)
	BYTE rgbReserved; // 保留字,必须为0
} RGBQUAD;

int main(int argc, char** argv)
{
    FILE *result_r;// 输出的三个通道文件
    FILE *result_g;
    FILE *result_b;
	FILE *bmp;// 要读入的BMP文件
    FILE *copy;// 要复制的BMP文件
    long real_w;// 一个扫描行的实际占用字节数
    long offset = 0;// 用于偏移每行结尾处的冗余数据
    
	BITMAPFILEHEADER header;// BMP文件头
	BITMAPINFOHEADER info;// BMP信息头
    
    if (argc!=6) {
        printf("usage:<BMP file><r file><g file><b file><copy file>");
        return -1;
    }
    
    if ((bmp=fopen(argv[1], "r"))==NULL) {
        printf("the file of BMP isn't exist\n");
        return -1;
    }

    copy=fopen(argv[5],"w");
    
    fread(&header,14,1,bmp);
    fwrite(&header, 14, 1, copy);
    
    fread(&info,40,1,bmp);
    fwrite(&info, 40, 1, copy);
    
	printf("宽:%d 高:%d\n",info.biWidth,info.biHeight);
	printf("每个像素所需的位数: %d\n", info.biBitCount);
	printf("位图压缩类型: %d\n", 
C语言实现BMP图像处理(任意角度旋转) printf("请输入需要旋转的角度: ");printf("文件打开失败\n"); 阅读详情

相关推荐

C语言实现BMP格式图片的读写

经过一天的实践,终于弄明白的BMP

wonna be a lion, not a cat 1665

BMP文件调色(C语言)

本文讲的书单元色调色处理及BMP文件调色板与数据的关系。 BMP文件开头有固定格式其文件大小是由:文件信息头(14字节),位图信息头(40字节),调色板,位图数据四部分组成。前两者是固定格式,后两者数据是由前两者的信息确定的,这些网上一搜一大堆不在说明。本文用的是C语言自带的<windi.h>下的BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD,位图数据使用char型数组来存储。 例一、先读取一个bmp文件,读取文件信息如下...

CloudrRise_log的博客 1605

8位bmp文件获取像素

C语言读取8位bmp文件的像素点

qq_45975614的博客 1276

用C语言解析BMP文件实战指南

htmltable {th, td {th {pre {简介:本文深入介绍了如何使用C语言读取BMP图像文件,并详细解释了BMP文件的结构,包括文件头、位图信息头和像素数据部分。通过逐步解析文件和处理像素数据,学习者可以掌握如何在C语言中操作和处理图像数据。文中提供的示例项目有助于初学者更直观地理解整个过程,并为学习图像处理和计算机图形学打下基础。

weixin_42351520的博客 982

C语言实现BMP图像读写处理程序

在C语言中,文件I/O操作主要通过标准库函数实现。这些函数定义在stdio.h头文件中。对于BMP文件的处理,最常用的函数包括fopenfread和fwrite。

weixin_42298164的博客 851

Zynq 【SDK裸机开发之PS】——DDR的内存分配使用详解

Zynq如果跑操作系统的话,内存管理的工作都会交给系统来操作,但是如果是裸机的话,则需要自己对DDR3的内存进行管理。

shizhibuyi1234的博客 7380

服务器安全配置:二、本地安全策略设置

密码最长使⽤期限”设置为“90天”;“⽤可以还原的加密来存储密码”设置为“禁⽤”“复位账户锁定计数器”设置为15分钟,贴图这里是我自己设置的时间,15分钟也够用,具体看自己需要。”网络访问: 不允许 SAM 帐户和共享的匿名枚举“设置为“已启用””网络访问: 限制对命名管道和共享的匿名访问“设置为“已启用””网络访问: 不允许匿名枚举 SAM 帐户“设置为“已启用”“关机: 允许系统在未登录的情况下关闭”设置为“已禁用”(1)交互式登录:不显示最后的⽤户名”设置为“已启⽤”

weixin_48825672的博客 3137

Fastjson2 2.0.26反序列化漏洞深度剖析:从原理到PoC构造

本文深度剖析了Fastjson2在2.0.26及之前版本中存在的反序列化漏洞。该漏洞允许攻击者通过构造包含恶意TemplatesImpl对象的JSONArray,并利用BadAttributeValueExpException触发,在反序列化过程中实现远程代码执行。文章从漏洞原理、PoC构造、利用链分析到防御建议,提供了全面的技术解读,帮助开发者和安全人员理解其危害并采取应对措施。

d3e4f的博客 1052

如何在SpringBoot中实现AI 流式输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1484

9、硬件工程师笔试面试知识器件篇——三极管(2025版本)

本文全面介绍了三极管的基础知识与应用,包括其结构、类型、工作原理、工作状态、功能、应用场景及特性参数。详细探讨了三极管在信号放大、无线通信、音频设备及医疗设备中的具体应用,并深入分析了设计放大电路时如何平衡增益与噪声、优化偏置电路以提高稳定性、使用负反馈改善性能等关键问题。此外,文章还涵盖了高频电路设计、温度补偿策略、电磁干扰防护等实用内容,为硬件工程师提供了全面的技术参考和设计指导。

XU157303764的博客 7314

(计算机组成原理)第二章数据的表示和运算-第二节:数字电路基础知识

本文介绍了计算机组成原理中的逻辑门电路、多路选择器和三态门。逻辑门电路包括基本逻辑运算(与、或、非)和复合逻辑运算(与非、或非、异或、同或),这些运算通过门电路实现,并满足分配律和结合律。多路选择器(MUX)用于从多个输入信号中选择一个输出,广泛应用于数据选择、资源共享和逻辑函数实现等场景。三态门则具有三种输出状态(高电平、低电平、高阻态),常用于总线控制和信号隔离。这些元件在数字电路设计和计算机系统中具有重要作用。

快乐江湖的博客 2475

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 742

DO-297标准详解:IMA系统开发与认证指南

DO-297的前言部分为读者提供了本指南的概述,说明了该标准的编写背景、主要目标、目标受众以及该文件在开发和认证集成模块化航空电子(IMA,Integrated Modular Avionics)系统中的作用。作为现代航空电子架构的重要组成部分,IMA系统大幅度简化了航空电子系统的硬件配置,增加了灵活性并降低了成本。因此,DO-297成为确保IMA系统开发、集成和认证符合适航标准的核心文件。在现代航空领域,系统复杂性逐渐增加,传统上各子系统独立运行的方式已经不适应多任务、多功能的需求。

qq_41854911的博客 1586

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: iOS中的ScrollView
下一篇: 【文档】Racket中的并发与并行
hrcnpc
博客等级 码龄15年 9粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值