显示 BMP 图片
BMP 图像介绍BMPBitmap是 Windows 操作系统中的标准图像文件格式文件后缀名为 .bmp。它采用位映射存储格式图像数据没有进行任何压缩因此文件占用空间大但无失真、解析简单。BMP 图像深度可选1bit、4bit、8bit、16bit、24bit、32bit。典型的 BMP 文件由以下四部分组成数据段 大小 说明BMP 文件头 14 字节 文件格式、大小、位图数据偏移量位图信息头 通常 40 或 56 字节 尺寸、位深度、压缩方式、颜色索引调色板 由颜色索引数决定 可选索引到颜色的映射表位图数据 由图像尺寸决定 图像原始数据真彩色图像16位、24位、32位不需要调色板位图信息头后面紧跟位图数据。BMP 文件头结构typedef struct tagBITMAPFILEHEADER {UINT16 bfType; /* 文件类型“BM” 表示 Windows 位图/DWORD bfSize; /文件大小字节/UINT16 bfReserved1; /保留必须为 0/UINT16 bfReserved2; /保留必须为 0/DWORD bfOffBits; /从文件起始到位图数据的字节偏移量/} BITMAPFILEHEADER;位图信息头结构typedef struct tagBITMAPINFOHEADER {DWORD biSize; /位图信息头大小/LONG biWidth; /图像宽度像素/LONG biHeight; /图像高度像素正数为倒向位图负数为正向位图/WORD biPlanes; /色彩平面数总为 1/WORD biBitCount; /像素深度1/4/8/16/24/32/DWORD biCompression; /压缩类型0RGB, 3Bit-Fields/DWORD biSizeImage; /图像数据大小/LONG biXPelsPerMeter; /水平分辨率像素/米/LONG biYPelsPerMeter; /垂直分辨率像素/米/DWORD biClrUsed; /实际使用的颜色索引数/DWORD biClrImportant; /重要颜色索引数 */} BITMAPINFOHEADER;正向位图与倒向位图正向位图biHeight 为负数图像数据按左上角到右下角排列水平从左到右垂直从上到下。倒向位图biHeight 为正数图像数据按左下角到右上角排列水平从左到右垂直从下到上。大多数 BMP 图像为倒向位图。RGB 与 Bit-Fields 编码对于 16bpp 及以上的位图不使用调色板有两种编码格式RGB 编码R、G、B 三种颜色信息容量均分如 24bpp 各占 8 位。Bit-FieldsBF编码利用位域掩码确定 RGB 三分量的信息容量。当压缩方式为 BFbiCompression3时位图信息头大小为 56 字节多出的 16 字节为 R、G、B、A 四个分量的位域掩码。A 分量即 Alpha透明度 通道取值范围 0~2550 表示完全透明255 表示完全不透明。在 BMP 中通常无实际意义但 ARGB8888 格式会占 8 位。位域掩码的作用指出 R、G、B或 A各分量在一个像素值中分别占多少位、位于什么位置。通过掩码即可从像素值中提取或组合出各颜色分量从而动态判断像素格式。对于 RGB565 格式R、G、B 的位域掩码分别为 0xF800、0x07E0、0x001FR 通道高 5 位bit 15~11G 通道中间 6 位bit 10~5B 通道低 5 位bit 4~0在 LCD 上显示 BMP 图像显示 BMP 图像的核心思路解析 BMP 文件头和位图信息头读取位图数据然后写入 LCD 显存。示例代码#include stdio.h#include stdlib.h#include sys/types.h#include sys/stat.h#include fcntl.h#include unistd.h#include sys/ioctl.h#include string.h#include linux/fb.h#include sys/mman.h/**** BMP 文件头数据结构 ****/typedef struct {unsigned char type[2];unsigned int size;unsigned short reserved1;unsigned short reserved2;unsigned int offset;}attribute((packed)) bmp_file_header;/**** 位图信息头数据结构 ***/typedef struct {unsigned int size;int width;int height;unsigned short planes;unsigned short bpp; /bits per pixel每个像素占多少位 */unsigned int compression;unsigned int image_size;int x_pels_per_meter;int y_pels_per_meter;unsigned int clr_used;unsigned int clr_omportant;}attribute((packed)) bmp_info_header;static int width;static int height;static unsigned short *screen_base NULL;static unsigned long line_length;static int show_bmp_image(const char *path){bmp_file_header file_h;bmp_info_header info_h;unsigned short *line_buf NULL;unsigned long line_bytes;unsigned int min_h, min_bytes;int fd -1;int j;/* 打开文件 */ if (0 (fd open(path, O_RDONLY))) { perror(open error); return -1; } /* 读取 BMP 文件头 */ if (sizeof(bmp_file_header) ! read(fd, file_h, sizeof(bmp_file_header))) { perror(read error); close(fd); return -1; } if (0 ! memcmp(file_h.type, BM, 2)) { fprintf(stderr, its not a BMP file\n); close(fd); return -1; } /* 读取位图信息头 */ if (sizeof(bmp_info_header) ! read(fd, info_h, sizeof(bmp_info_header))) { perror(read error); close(fd); return -1; } printf(文件大小: %d\n 位图数据的偏移量: %d\n 位图信息头大小: %d\n 图像分辨率: %d*%d\n 像素深度: %d\n, file_h.size, file_h.offset, info_h.size, info_h.width, info_h.height, info_h.bpp); /* 将文件读写位置移动到图像数据开始处 */ if (-1 lseek(fd, file_h.offset, SEEK_SET)) { perror(lseek error); close(fd); return -1; } /* 申请一个 buf、暂存 bmp 图像的一行数据 */ line_bytes info_h.width * info_h.bpp / 8; // bpp ÷ 8 将位(bit)转为字节(Byte) line_buf malloc(line_bytes); if (NULL line_buf) { fprintf(stderr, malloc error\n); close(fd); return -1; } if (line_length line_bytes) // line_length: LCD一行字节数 min_bytes line_bytes; // line_bytes: BMP一行字节数 else // 取较小值防止memcpy越界 min_bytes line_length; /* 读取图像数据显示到 LCD */ if (0 info_h.height) { // 倒向位图 if (info_h.height height) { min_h height; lseek(fd, (info_h.height - height) * line_bytes, SEEK_CUR); screen_base width * (height - 1); } else { min_h info_h.height; screen_base width * (info_h.height - 1); } for (j min_h; j 0; screen_base - width, j--) { read(fd, line_buf, line_bytes); memcpy(screen_base, line_buf, min_bytes); } } else { // 正向位图 int temp 0 - info_h.height; if (temp height) min_h height; else min_h temp; for (j 0; j min_h; j, screen_base width) { read(fd, line_buf, line_bytes); memcpy(screen_base, line_buf, min_bytes); } } close(fd); free(line_buf); return 0;}int main(int argc, char *argv[]){struct fb_fix_screeninfo fb_fix;struct fb_var_screeninfo fb_var;unsigned int screen_size;int fd;if (2 ! argc) { fprintf(stderr, usage: %s bmp_file\n, argv[0]); exit(-1); } if (0 (fd open(/dev/fb0, O_RDWR))) { perror(open error); exit(EXIT_FAILURE); } ioctl(fd, FBIOGET_VSCREENINFO, fb_var); ioctl(fd, FBIOGET_FSCREENINFO, fb_fix); screen_size fb_fix.line_length * fb_var.yres; line_length fb_fix.line_length; width fb_var.xres; height fb_var.yres; screen_base mmap(NULL, screen_size, PROT_WRITE, MAP_SHARED, fd, 0); if (MAP_FAILED (void *)screen_base) { perror(mmap error); close(fd); exit(EXIT_FAILURE); } memset(screen_base, 0xFF, screen_size); show_bmp_image(argv[1]); munmap(screen_base, screen_size); close(fd); exit(EXIT_SUCCESS);}显示 BMP 的主要流程打开 BMP 文件读取文件头和位图信息头。校验文件类型是否为 “BM”。通过 lseek() 将文件读写位置移至图像数据起始处file_h.offset。根据 info_h.height 判断正向/倒向位图逐行读取图像数据并 memcpy 到显存映射区。关闭文件释放资源。注意示例代码默认传入的 BMP 图像为 RGB565 格式。如需兼容 RGB888 等其他格式需根据 bmp_info_header 中的 compression 和位域掩码进行判断处理。

相关新闻

大语言模型文本长度控制:LIFEBench基准测试解析

大语言模型文本长度控制:LIFEBench基准测试解析

1. 项目概述:LIFEBench基准测试的核心价值大语言模型(LLMs)在解决复杂推理任务方面展现出惊人能力,却在一个看似简单的功能上频繁翻车——按照指定长度生成文本。当用户要求"写一篇5000字的行业分析"时,模型…

2026/7/22 5:02:40 阅读更多 →
C++与Qt字符串传参性能优化:值传递、引用与COW机制详解

C++与Qt字符串传参性能优化:值传递、引用与COW机制详解

1. 项目概述:从一次性能调优说起最近在重构一个历史遗留的C/Qt项目时,遇到了一个典型的性能瓶颈。一个核心的数据处理模块,在处理大量文本数据时,CPU占用率异常高。经过Profile工具(如perf或Qt Creator自带的分析器&am…

2026/7/22 5:02:40 阅读更多 →
C++搜索引擎核心:基于Boost库的正倒排索引压缩与高性能实现

C++搜索引擎核心:基于Boost库的正倒排索引压缩与高性能实现

1. 项目概述:从零构建一个高性能的C搜索引擎核心 最近在整理过往的项目代码,翻出了一个挺有意思的“老伙计”——一个基于Boost库纯手工打造的C搜索引擎核心模块。这个项目的核心目标非常明确:在有限的内存和磁盘空间下,高效地存储…

2026/7/22 5:01:40 阅读更多 →

最新新闻

灰狼算法优化CNN-LSTM-Attention时序预测模型

灰狼算法优化CNN-LSTM-Attention时序预测模型

1. 项目概述:灰狼算法与四模型融合的时序预测方案这个项目本质上是一个多模型融合的时间序列预测框架,核心创新点在于将灰狼优化算法(GWO)与四种深度学习模型变体相结合,用于处理多变量时间序列预测问题。我在工业预测性维护项目中曾多次采用…

2026/7/22 9:06:10 阅读更多 →
2D动画制作全流程解析:从Golden Hour光影效果到技术实现

2D动画制作全流程解析:从Golden Hour光影效果到技术实现

这次我们来看一个名为"【日常2D】《Golden Hour》 |20260518"的2D动画项目。从标题信息来看,这很可能是一个个人创作的2D动画作品,创作日期为2026年5月18日,主题围绕"Golden Hour"(黄金时刻)展开。…

2026/7/22 9:06:10 阅读更多 →
蚂蚁开源万亿参数模型Ring-2.5-1T:架构解析与应用实践

蚂蚁开源万亿参数模型Ring-2.5-1T:架构解析与应用实践

1. 项目背景与核心价值Ring-2.5-1T是蚂蚁集团最新开源的万亿参数级思考模型,其命名中的"2.5"代表模型架构代际,"1T"则明确标注了参数量级。这个开源动作最引人注目的特点在于:它不仅开放了基础模型权重,更重要…

2026/7/22 9:06:10 阅读更多 →
AuEmoChat:基于深度学习的端到端情感语音合成技术解析

AuEmoChat:基于深度学习的端到端情感语音合成技术解析

在语音合成技术从机械朗读走向自然对话的过程中,情感理解与渲染一直是核心挑战。传统语音合成系统往往侧重于音质和流畅度,但在对话场景中,缺乏情感变化的语音会显得单调且不自然,难以实现真正的人机交互沉浸感。AuEmoChat 正是针…

2026/7/22 9:06:10 阅读更多 →
AI原生编程-马里奥成长记(已更新到第三关卡,等你来冲关)

AI原生编程-马里奥成长记(已更新到第三关卡,等你来冲关)

一个月前,我用 AI 原生开发的方式复刻了一版超级玛丽——Canvas 2D 手绘像素、Web Audio 合成 8-bit 音效、ASCII 字符地图构建关卡,单文件 1184 行,零外部资源。 那时候它只有一关:经典的 World 1-1 地面关卡,有栗宝宝…

2026/7/22 9:06:10 阅读更多 →
红米K40自定义内核编译教程:修复1%电量bug与集成KernelSU

红米K40自定义内核编译教程:修复1%电量bug与集成KernelSU

如果你正在使用红米K40(代号alioth)并且遇到了电量卡在1%无法充电的bug,或者想要一个集成KernelSU功能的自定义内核,那么今天的内容正是为你准备的。很多人以为编译Android内核是专业开发者的专利,但实际上借助GitHub上…

2026/7/22 9:05:09 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻