显示 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/26 9:23:24 阅读更多 →
C++与Qt字符串传参性能优化:值传递、引用与COW机制详解

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

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

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

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

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

2026/7/25 15:00:59 阅读更多 →

最新新闻

Claude Code 里的 Skill 和 Subagent,别把工具箱和外包小队混在一起

Claude Code 里的 Skill 和 Subagent,别把工具箱和外包小队混在一起

今天讨论 Claude Code 的扩展体系,很容易卡在一个看似简单的问题上,已经有了 Skill,为什么还要 Subagent。两者都能让 Claude Code 变强,都能封装经验,都能减少重复沟通,但它们解决的不是同一类问题。Skill 更像我们放在团队工具箱里的标准件,API 设计规范、发布流程、代…

2026/7/26 9:22:40 阅读更多 →
嵌入式系统中断与内存控制:从硬件原理到雷达信号处理实战

嵌入式系统中断与内存控制:从硬件原理到雷达信号处理实战

1. 项目概述与核心价值在嵌入式系统开发,尤其是对实时性要求严苛的雷达信号处理、工业控制或汽车电子领域,系统能否及时响应外部事件,并高效、可靠地处理数据流,是决定产品成败的关键。这背后依赖两大核心硬件机制:中断…

2026/7/26 9:22:40 阅读更多 →
终极指南:3步轻松解密网易云音乐NCM文件,实现音乐播放自由

终极指南:3步轻松解密网易云音乐NCM文件,实现音乐播放自由

终极指南:3步轻松解密网易云音乐NCM文件,实现音乐播放自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式音乐无法在其他播放器使用而烦恼吗?ncmdump解密工具是你的…

2026/7/26 9:22:40 阅读更多 →
企业级RAG应用实战:Dify与LangChain技术栈解析

企业级RAG应用实战:Dify与LangChain技术栈解析

1. 项目概述:企业级RAG应用的核心价值最近半年,我帮三家不同规模的企业落地了RAG(检索增强生成)系统。每次从零开始搭建时,技术选型总是最耗时的环节——直到发现Dify和LangChain v1.0的组合能解决80%的共性问题。这篇…

2026/7/26 9:22:40 阅读更多 →
自监督学习加速药物分子研发的技术实践

自监督学习加速药物分子研发的技术实践

1. 自监督学习如何加速药物分子研发 去年我在参与一个抗肿瘤药物研发项目时,团队花了整整三个月筛选了2000多个候选分子。直到我们引入自监督学习方法后,筛选效率直接翻倍。这种技术正在彻底改变传统药物研发的流程。 自监督学习(Self-super…

2026/7/26 9:22:40 阅读更多 →
基于YOLOv5的手势验证码实现与优化实践

基于YOLOv5的手势验证码实现与优化实践

1. 项目背景与核心价值 手势验证码作为人机验证的重要方式,在各类互联网服务中广泛应用。传统验证码容易被自动化工具破解,而基于人体姿态的交互式验证需要真实用户的肢体参与,显著提升了安全性。这个项目通过YOLO算法实现从数据采集到模型部…

2026/7/26 9:21:40 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

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

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

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

月新闻