bmp文件解码

合集下载

基于STM32的BMP图片解码系统

基于STM32的BMP图片解码系统
整 幅 图片 的缓 冲 区 .所 以本 系 统 的设计 过程 中采用 了用 时 间换
结构 . 包含 B 它 MP图 像 文 件 的 类 型 、 示 内 容 等 信 息 ; 图 显 位
信息数据结构 , 它包 含 有 B MP 图像 的宽 、 、 缩 方 法 , 及 高 压 以
空 间 的方 式 , 即采 用 了 边解 码 边 显 示 的方 法 . 省去 了外 部 数 据 R M, A 随之 而来 的就 是显示 的 速度 比直接 调到 内存 中要 慢 一些 。
22 液 晶 显 示部 分 电路 设 计[ . S l
液 晶 显 示 部 分 主 要 由 微 控 制 器 s M3 F 0 R T T 2 l 3 B 6驱 动
S 卡 的 读写 操 作 。 D
14 F . AT 文 件 系统 简 介
A 4 3 0 S N W— O M2 0 2L T Q O H完 成 人 机界 面状 态 的显 示 ,通 过 发
送命 令 字 , 成 液 晶模 块 的 初 始 化 。 成 对 内容 的显 示 。 示 完 完 显 部分 的硬 件 电路 接 口图 如 图 2所 示 。
( 中国 飞 行 试 验研 究 院 陕 西 西 安 7 0 6 1 0 9)
摘 要 : 计 了 一 种 基 于 S M3 设 T 2处 理 器 的 便 携 式 B P 图 片解 码 系 统 。 在 设 计 过 程 中采 用 了从 S M D卡 中读 取 编 码 的 同 时 同步 解 码 的 方 法 , 效 地 减 少 了 系统 内存 的 消 耗 。 完 成 了基 于 A M 最 新 C r x M3内核 的 处 理 器 S M3 有 R o e— t T 2的 B P M
S D卡 ( e ueD g a M mo a ) 文 翻 译 为 安 全 数 码 S c r i tl e r C r 中 i y d

嵌入式Linux系统的图片解码和显示方法详解

嵌入式Linux系统的图片解码和显示方法详解

嵌入式Linux系统的图片解码和显示方法详解嵌入式Linux系统在如今的物联网应用中扮演着重要的角色。

其中,图片解码和显示是嵌入式系统中常见的需求,它们对于展示图形化界面、实现图像处理等方面都具有重要意义。

本文将详细讨论嵌入式Linux系统中的图片解码和显示方法。

一、图片解码方法在嵌入式Linux系统中,常见的图片格式有JPEG、PNG、BMP等。

针对不同的图片格式,可以采用不同的解码方法。

1. JPEG解码JPEG是一种广泛应用于图像压缩和存储的格式。

在嵌入式Linux系统中,常用的JPEG解码库有libjpeg和libturbojpeg等。

libjpeg是一个开源的JPEG解码库,广泛应用于多个平台。

该解码库提供了一系列的API接口,可以方便地在嵌入式Linux系统中进行JPEG解码操作。

通过使用libjpeg库,可以将JPEG图片解码为RGB格式,从而在系统中进行后续的图像处理或显示。

libturbojpeg是libjpeg的增强版,它在性能上有一定的优化,特别适用于有限的资源嵌入式系统。

libturbojpeg同样提供了丰富的API接口,可以实现对JPEG图片的高效解码。

2. PNG解码PNG是一种无损的位图格式,广泛应用于图像存储和传输。

在嵌入式Linux系统中,可以使用libpng库进行PNG图片的解码。

libpng是一个开源的PNG解码库,它提供了灵活的API接口,可以实现对PNG图片的解码和处理。

通过libpng库,可以将PNG 图片解码为RGBA格式,方便在系统中进行进一步的图像处理或显示。

3. BMP解码BMP是一种非压缩的位图格式,可以直接在屏幕上显示。

在嵌入式Linux系统中,可以通过解析BMP文件头和像素数据,实现对BMP图片的解码。

BMP图片的解码相对简单,只需按照文件格式解析头信息,提取像素数据,并根据颜色格式进行解析,即可获取图片的RGB数据。

二、图片显示方法在嵌入式Linux系统中,图片的显示可以通过多种方式实现。

bmp解码原理

bmp解码原理

bmp解码原理
BMP(Bitmap Image File)是一种常见的图像文件格式,其解码原理主要包括以下几个步骤:
1. 读取文件头信息:BMP文件以特定的文件头标识开始,用于标识该文件
是一个BMP格式的文件。

这些信息包括BMP文件的类型、大小、版本等。

2. 解析图像头信息:紧随文件头信息之后的是图像头信息,包括图像的宽度、高度、像素数、颜色深度等信息。

这些信息用于确定图像的尺寸、颜色模式等。

3. 读取像素数据:根据图像头信息中的宽度、高度和像素数,读取相应的像素数据。

BMP图像的像素数据按照一定的顺序存储,通常是按照行优先的
顺序逐行读取。

4. 转换像素数据:由于BMP图像的像素数据是以特定的格式存储的,解码时需要将这些数据转换为可显示的像素值。

这通常涉及到将颜色深度转换为实际的颜色值,以及进行必要的色彩空间转换等。

5. 显示图像:将解码后的像素数据送入显示设备,按照一定的显示模式进行显示,最终呈现出BMP图像的内容。

在解码过程中,需要注意一些细节问题,比如数据对齐、像素格式转换等。

此外,还需要根据具体的BMP版本和编码方式进行相应的解码处理。

嵌入式Linux系统中图片解码和显示的动态加载技术

嵌入式Linux系统中图片解码和显示的动态加载技术

嵌入式Linux系统中图片解码和显示的动态加载技术在嵌入式Linux系统中,图片解码和显示是一个常见的需求。

本文将介绍一种动态加载技术,可以实现在嵌入式Linux系统中灵活地解码和显示图片。

一、嵌入式Linux系统中的图片解码技术在嵌入式Linux系统中,图片通常以二进制数据的形式存储在文件系统中。

为了将图片显示在屏幕上,需要对图片进行解码。

常见的图片格式有JPEG、PNG和BMP等。

不同的图片格式需要使用不同的解码算法。

1. JPEG图片解码JPEG是一种广泛使用的图片格式,其解码算法较为复杂。

在嵌入式Linux系统中,可以使用开源的图像处理库libjpeg来进行JPEG图片的解码。

libjpeg提供了一组API接口,可以方便地将JPEG图片解码成为RGB格式或YUV格式的图像数据。

2. PNG图片解码PNG是一种无损压缩的图片格式,其解码算法相对简单。

在嵌入式Linux系统中,可以使用开源的图像处理库libpng来进行PNG图片的解码。

libpng同样提供了一组API接口,可以方便地将PNG图片解码成为RGB格式的图像数据。

3. BMP图片解码BMP是一种简单的图片格式,其解码算法较为简单。

在嵌入式Linux系统中,可以使用开源的图像处理库libbmp来进行BMP图片的解码。

libbmp提供了一组API接口,可以将BMP图片解码成为RGB格式的图像数据。

二、嵌入式Linux系统中的图片显示技术在嵌入式Linux系统中,图片显示通常是通过显示驱动来实现。

显示驱动负责将解码后的图像数据发送给显示设备,显示设备将图像数据显示在屏幕上。

1. Framebuffer技术Framebuffer是一种常见的图形显示设备,它提供了一块连续的内存区域用于存储图像数据。

在嵌入式Linux系统中,可以通过Framebuffer设备将图像数据显示在屏幕上。

可以使用开源的framebuffer库fbi来实现在Framebuffer设备上显示图像数据。

bmp文件解码

bmp文件解码

件而言的。有些位图,如真彩色图是不需要调色板的,BITMAPINFOHEADER
后直接是位图数据。
调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则
有 2 个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,
其定义如下:
typedef struct tagRGBQUAD {
指定目标设备的垂直分辨Байду номын сангаас,单位同上。 46 biClrUsed
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2。 50 biClrImportant
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重 要的。
第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文
还有一点也需要注意:Windows 要求每一行的数据的长度必须是 4Bytes 的整 数倍,如果不是,要以值为 0 的字节补充,如果读取的时候不处理,会得到 一个倾斜的图像。
unsigned char data[9604]; FATFS fs; FRESULT res; UINT br; /* *********************************************************** * Function name : Pic_Viewer();
DWORD 为无符号 32 位整数),各个域的说明如下: 0 bfType
指定文件类型,必须是 0x424D,即字符串“BM” 2 bfSize
指定文件大小,包括这 14 个字节。 6 bfReserved1,bfReserved2
为保留字,不用考虑 10 bfOffBits
为从文件头到实际的位图数据的偏移字节数,即图中前三个部分的长度 之和。

项目(2)-基于51单片机的BMP图片解码(电子相册)

项目(2)-基于51单片机的BMP图片解码(电子相册)
更多与 BMP 存储格式相关的资料,请看开发板配套资料学习资料->BMP 图 片这一部分。
4.2、解码算法
首先从位图的信息头中得到位图的像素,位图的高度和宽度,还有位图的送 颜色位数等参数。
图片大小处理:我们使用的 TFT 液晶屏的像素是 320*240 大小。如果图片的 像素小于 320*240,则可以将图片的全部像素输出。但如果图片大小比 320*240 大,则要缩小该图片才能显示。我们通常采取的方法是用比例抽取方法,就是按 一定的缩小比例,抽取图片中的某些像素输出显示,其它像素则丢弃不要。
2:位图信息头
BMP 位图信息头数据用于说明位图的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{
嵌入式学习——BMP 图片解码(项目 2)
DWORD biSize; // 本结构所占用字节数 LONGbiWidth; // 位图的宽度,以像素为单位 LONGbiHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的级别,必须为 1 WORD biBitCount// 每个像素所需的位数,必须是 1(双色), // 4(16 色),8(256 色)或 24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8 压缩类型)或 2(BI_RLE4 压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数 LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER;

BMP格式解析

BMP格式解析

BMP格式解析⼀、介绍 BMP⽂件格式,⼜称为位图,是Windows系统中⼴泛使⽤的图像⽂件格式。

BMP⽂件的数据分为四个部分:bmp⽂件头(bmp file header):提供⽂件的格式、⼤⼩等信息位图信息头(bitmap information):提供图像数据的尺⼨、位平⾯数、压缩⽅式、颜⾊索引等信息调⾊板(color palette):可选,如使⽤索引来表⽰图像,调⾊板就是索引与其对应的颜⾊的映射表位图数据(bitmap data):图像数据⼆、代码⽰例#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>struct bmp_header{unsigned short type; //⽂件类型unsigned int total_size; //整个位图⼤⼩,头部 + 图像数据单位字节unsigned short reserved1;unsigned short reserved2;unsigned int valid_offset; //图像数据偏移量} __attribute__((packed));struct bmp_info{unsigned int info_size; //该结构体⼤⼩,固定40字节unsigned int bmp_width; //图⽚宽度unsigned int bmp_height; //图⽚⾼度unsigned short planes; //总是1unsigned short bitcount; //像素多少位表⽰unsigned int compression; // 0:BI_RGB 不压缩; ......unsigned int img_size; //图像有效数据⼤⼩,单位字节int x_pix_meter; //⽔平分辨率,像素/⽶表⽰int y_pix_meter; //垂直分辨率,像素/⽶表⽰unsigned int color_used; //位图实际使⽤彩⾊表中的颜⾊索引数,⼀般0unsigned int color_mportants; //color_used 上⾯使⽤的索引值重要数, 0表⽰都重要}__attribute__((packed));int bmp_analyze(unsigned char *path){int fd = -1, i;struct bmp_header f_header;struct bmp_info f_info;//打开bmp图⽚fd = open(path, O_RDONLY);if (fd < 0) {printf("open %s error.\n", path);return -1;}//读取⽂件头信息read(fd, &f_header, sizeof(struct bmp_header));printf("type:0x%x(%c%c)\n", f_header.type, f_header.type&0xff, (f_header.type>>8)&0xff);printf("total_size:%d\n", f_header.total_size);printf("reserved1:%d\n", f_header.reserved1);printf("reserved2:%d\n", f_header.reserved2);printf("valid_offset:%d\n", f_header.valid_offset);read(fd, &f_info, sizeof(struct bmp_info));printf("info_size:%d\n", f__size);printf("bmp_width:%d\n", abs(f_info.bmp_width));printf("bmp_height:%d\n", abs(f_info.bmp_height));printf("planes:%d\n", f_info.planes);printf("bitcount:%d\n", f_info.bitcount);printf("compression:%d\n", f_pression);printf("img_size:%d\n", f_info.img_size);printf("x_pix_meter:%d\n", f_info.x_pix_meter);printf("y_pix_meter:%d\n", f_info.y_pix_meter);printf("color_used:%d\n", f_info.color_used);printf("color_mportants:%d\n", f_info.color_mportants);//关闭打开的⽂件close(fd);return0;}int main(int argc, char **argv){unsigned char *path = argv[1];if(path == NULL) {printf("invalid file path \n");exit(-1);} else {printf("read bmp file: %s\n", path); }bmp_analyze(path);return0;}三、效果./a.out 24x32_3.bmpread bmp file: 24x32_3.bmptype:0x4d42(BM)total_size:3126reserved1:0reserved2:0valid_offset:54info_size:40bmp_width:24bmp_height:32planes:1bitcount:32compression:0img_size:3072x_pix_meter:2834y_pix_meter:2834color_used:0color_mportants:0四、附件解析 链接:注意格式是ARGB8888,只不过⼩端存储(低字节放在低地址),图⽚数据⼤⼩ 24*32*4字节 = 3072,加上头部 14 + 40 = 3126 字节后续会使⽤该BMP图⽚打⽔印在YUV上:。

bmp信号通路 机制

bmp信号通路 机制

bmp信号通路机制标题:bmp信号通路的工作原理引言:bmp信号通路是一种常用的数字图像处理方式,它在图像传输和存储中起着重要的作用。

本文将介绍bmp信号通路的工作原理,包括信号的产生、传输和解码过程,以及相关的技术细节。

一、信号的产生bmp信号通路的第一步是信号的产生,即将图像转换为数字信号。

传统的bmp格式图像是由像素点组成的,每个像素点的颜色值通过RGB三个分量来表示。

在信号的产生过程中,首先将图像分割成若干个像素点,然后通过采样和量化技术将每个像素点的RGB值转换为数字信号。

二、信号的传输经过信号产生后,数字信号需要通过信号通路进行传输。

在传输过程中,主要考虑的是信号的稳定性和抗干扰性。

为了保证信号的稳定性,通常会采用差分编码和调制技术来对信号进行处理。

差分编码可以减小信号传输中的噪声干扰,而调制技术可以将数字信号转换为模拟信号,以便在信号传输过程中更好地适应信道环境。

三、信号的解码在信号传输到接收端后,需要进行解码操作,将数字信号转换为原始图像。

解码过程主要包括差分解码和调制解调两个步骤。

差分解码将差分编码的信号还原为原始信号,而调制解调则将模拟信号转换为数字信号。

通过这两个步骤的处理,最终可以得到与原始图像相符的数字信号。

结论:bmp信号通路是一种重要的数字图像处理方式,它通过信号的产生、传输和解码过程,实现了图像的传输和存储。

在实际应用中,需要注意信号的稳定性和抗干扰性,以及解码过程中的差分解码和调制解调等细节。

通过深入了解bmp信号通路的工作原理,可以更好地理解数字图像处理的基本原理,并在实际应用中进行优化和改进。

bmp信号通路 机制

bmp信号通路 机制

bmp信号通路机制
bmp信号通路是指基于位图格式的图像文件传输过程中的信号传输路径和机制。

位图格式是一种常见的图像文件格式,它将图像以像素点的形式进行存储和传输。

在图像文件传输过程中,bmp信号通路起到了至关重要的作用。

bmp信号通路的机制是通过将图像文件转化为二进制数据流进行传输。

图像文件经过编码转换后,以二进制的形式传输到目标设备。

这一过程中,信号经过传输介质,如网络或存储设备,以及传输协议的支持,如TCP/IP协议,通过传输层、网络层和物理层的处理,最终将图像数据传输到目标设备。

bmp信号通路的机制还包括对传输过程中的错误进行纠正和恢复。

为了保证图像文件的完整性和准确性,传输中的错误需要进行检测和处理。

常用的方法包括奇偶校验、循环冗余校验等。

通过这些校验方法,可以对传输过程中可能出现的错误进行检测和纠正,确保图像文件的传输质量。

bmp信号通路的机制还涉及到图像数据的解码和显示。

在接收端,接收到的二进制数据流需要进行解码,恢复为原始的图像数据。

解码过程中,需要根据图像文件的格式和编码规则,对数据进行解析和还原。

解码后的数据可以通过图像显示设备进行显示,以呈现出原始图像的内容和质量。

总结起来,bmp信号通路通过将图像文件转化为二进制数据流,经过传输介质和传输协议的支持,实现图像文件的传输。

在传输过程中,对错误进行检测和纠正,保证传输质量。

最后,通过解码和显示过程,将传输的数据还原为原始图像的内容。

bmp信号通路的机制确保了图像文件的准确传输和显示,是图像传输过程中不可或缺的一环。

嵌入式Linux系统中图片解码和显示的开发技巧与工具

嵌入式Linux系统中图片解码和显示的开发技巧与工具

嵌入式Linux系统中图片解码和显示的开发技巧与工具嵌入式系统的发展使得嵌入式Linux系统越来越受到关注。

在嵌入式Linux系统中,图片解码和显示是一项非常重要的技术,涉及到图形图像的处理和显示。

本文将介绍在嵌入式Linux系统中图片解码和显示的开发技巧与工具。

一、图像解码技术在嵌入式Linux系统中,主要采用以下几种图像解码技术:1. JPEG解码技术JPEG是一种常用的图像压缩格式,具有压缩比高、解压缩速度快等特点。

在嵌入式Linux系统中,可以使用libjpeg等库对JPEG图像进行解码。

2. PNG解码技术PNG是一种无损压缩的图像格式,支持Alpha通道,具有透明度的效果。

在嵌入式Linux系统中,可以使用libpng等库对PNG图像进行解码。

3. BMP解码技术BMP是Windows系统上常用的图像格式,其图像数据存储形式简单,适合在嵌入式Linux系统中进行解码。

二、图像显示技术在嵌入式Linux系统中,一般采用以下几种图像显示技术:1. Framebuffer技术Framebuffer是一种不依赖于X Window系统的图形设备驱动程序接口,可以通过直接访问内存映射的方式来进行图像的显示。

在嵌入式Linux系统中,Framebuffer技术是一种常用的图像显示技术。

2. DirectFB技术DirectFB是一种轻量级的图形设备接口,提供了一套功能丰富的API,可以用来控制多种图形设备。

在嵌入式Linux系统中,可以使用DirectFB技术来进行图像的显示。

3. Qt技术Qt是一种跨平台的应用程序开发框架,提供了丰富的图形界面组件和功能。

在嵌入式Linux系统中,可以使用Qt技术进行图像的显示。

三、开发工具在嵌入式Linux系统中进行图片解码和显示的开发,可以选择以下开发工具:1. GCC编译器GCC是一种常用的开源编译器,可以用于在嵌入式Linux系统中编译和调试C/C++代码。

嵌入式Linux系统中图片解码和显示的图像分析技术

嵌入式Linux系统中图片解码和显示的图像分析技术

嵌入式Linux系统中图片解码和显示的图像分析技术嵌入式Linux系统中的图片解码和显示技术在各种应用中发挥着重要作用。

本文将探讨嵌入式Linux系统中使用的图像分析技术,重点讨论图像解码和图像显示的相关技术。

一、图像解码技术图像解码是将图像数据从编码格式转换为原始像素数据的过程。

在嵌入式Linux系统中,常用的图像解码技术有以下几种:1.1 JPEG解码技术JPEG(Joint Photographic Experts Group)是一种广泛使用的图像压缩标准,其解码技术在嵌入式Linux系统中得到了广泛应用。

JPEG解码技术能够高效地将JPEG格式的图像数据解码为原始的像素数据,以供后续的显示和处理。

1.2 PNG解码技术PNG(Portable Network Graphics)是一种无损压缩的图像格式,其解码技术在嵌入式Linux系统中也得到了广泛应用。

PNG解码技术能够将PNG格式的图像数据解码为原始的像素数据,同时保留图像的透明度信息,适用于需要保留背景透明效果的应用场景。

1.3 BMP解码技术BMP(Bitmap)是一种无压缩的图像格式,其解码技术在嵌入式Linux系统中也有所应用。

BMP解码技术能够将BMP格式的图像数据快速解码为原始的像素数据,但由于其无压缩的特点,文件大小较大,在资源有限的嵌入式系统中使用相对较少。

二、图像显示技术图像显示是将解码后的图像数据在屏幕上显示的过程。

在嵌入式Linux系统中,常用的图像显示技术有以下几种:2.1 Framebuffer技术Framebuffer技术是一种直接操作显存的图像显示技术,其在嵌入式Linux系统中得到了广泛应用。

Framebuffer技术通过在显存中维护一个或多个帧缓冲区,将解码后的图像数据直接写入显存,实现图像的快速显示。

2.2 DirectFB技术DirectFB技术是一种轻量级的图像显示技术,其在嵌入式Linux系统中也得到了广泛应用。

图像文件格式BMP文件格式详解

图像文件格式BMP文件格式详解

BMP文件格式BMP文件格式是Microsoft Windows下最常见的图像文件格式之一,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大;BMP 文件的图像深度可选lbit、4bit、8bit及24bit;BMP文件存储数据时,图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数;由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像都支持BMP图像格式;典型的BMP文件由四部分组成:1、位图头文件数据结构主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;2、信息数据结构包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息;3、包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板;4、位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右, 扫描行之间是从下到上;这种格式我们又称为Bottom_Up位图,当然与之相对的还有Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式;BMP文件结构位图文件bitmap file, BMP格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式; 以后的BMP格式与显示设备无关,因此把这种BMP格式称为设备无关位图Device Independentbit Bitmap , DIB格式, Windows能够在任何类型的显示设备上显示BMP位图;BMP位图默认的文件扩展名是bmp;1、文件结构位图文件可看成由4个部分组成:位图文件头Bitmap-File、位图信息头Bitmap-Information Header、彩色表Color Table和定义位图的字节阵列,它们的名称和符号如下表1所示:2、位图文件结构可综合在下表中:3、结构详解1位图文件头:它包含有关于文件类型、文件大小和存放位置等信息,在Windows 以上版本的位图文件中用BITMSPFILEHEADER结构体来定义;位图文件头包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段;BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息;其结构定义如下:typedef struct tagBITMAPFILEHEADER{WORD bfType; mp格式支持32位色DWORD biCompression; // 位图压缩类型,必须是0不压缩,// 1BI_RLE8压缩类型或2BI_RLE4压缩类型之一DWORD biSizeImage; // 位图的大小,以字节为单位LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数DWORD biClrImportant; // 位图显示过程中重要的颜色数} BITMAPINFOHEADER; //该结构占据40个字节它由位图信息头和彩色表组成,前者用BITMAPINFOHEADER结构体定义,后者用RGBQUAD结构体定义;1彩色表的定位:应用程序进行彩色表的定位时,可使用存储在biSize成员中的信息来查找在BITMAPINFO结构体中的彩色表;2biBitCount:biBitCount=1表示位图最多有两种颜色,黑色和白色;图像数据阵列中的每一位表示一个pixel:biBiCount=4表示位图最多有16种颜色;每个像素用场bit表示,交用这4bit 作为彩色表的表项来查找该像素的颜色;3ClrUsed:BITMAPINFOHEADER结构中的成员ClrUsed指定实际使用的颜色数目;48bit/pixel的图像数据压缩:BI_RLE8 8bit/pixel的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式可在同一幅图中的任何地方使用;编码方式由此及彼个字节组成,第一个字节指定使用相同颜色的像素数目,第二个字节指字使用的颜色索引;此外,这个字节对中的第一个字节可设置为0,联合使用第二个字节的值表示:●第二个字节的值为0 行的结束●第二个字节的值为1 图像结束●第二个字节的值为2 其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量绝对方式第一个字节设置为0,而第二个字节设置为03h~0FFh之间的一个值;在这种方式中,第二个字节表示跟在这个字节后面的字节数,每个字节包含单个像素的颜色索引;5每个像素为4位的图像数据压缩:BI_RLE4 每个像素为4位的RLE压缩编码,同样也可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式也可在同一幅图中的任何地方使用;编码方式由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引;绝对方式这个字节对中的第一个字节设置为0,第二个字节包含有颜色索引数,其后续字节包含有颜色索引,颜色索引存放在该字节的高、低4位中,一个颜色索引对应一个像素;BI_RLE4也同样联合使用第二个字节中的值表示:●第二个字节的值为0 行的结束●第二个字节的值为1 图像结束●第二个字节的值为2 其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量3彩色表:包含的元素与位图所具有的颜色数相同,像素的颜色用RGBQUAD结构来定义;彩色表中的颜色按颜色的重要性排序,这可辅助显示驱动程序为不能显示足够多颜色数的显示设备显示彩色图像;颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色;RGBQUAD结构的定义如下:typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色的亮度值范围为0-255BYTE rgbGreen; // 绿色的亮度值范围为0-255BYTE rgbRed; // 红色的亮度值范围为0-255BYTE rgbReserved; // 保留,必须为0} RGBQUAD;彩色表/调色板color table是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像的数据是指向调色板的索引;可以将调色板想象成一个数组,每个数组元素的大小为4字节,假设有一256色的BMP图像的调色板数据为:调色板0=黑、调色板1=白、调色板2=红、调色板3=蓝…调色板255=黄图像数据01 00 02 FF表示调用调色板1、调色板0、调色板2和调色板255中的数据来显示图像颜色;每个调色板的大小为4字节,按蓝、绿、红存储一个颜色值;4位图数据:紧跟在彩色表之后的是图像数据字节阵列;图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度;位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8 时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像;当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应R、G、B分量的值,这时候图像文件中没有颜色表;上面我已经讲过了,Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数即以字为单位,不足的以0填充,图像文件中一个扫描行所占的字节数计算方法:DataSizePerLine = biWidth biBitCount + 31 / 8;// 一个扫描行所占的字节数位图数据的大小按下式计算不压缩情况下:DataSize = DataSizePerLine biHeight;。

BMP文件解码的研究与实现

BMP文件解码的研究与实现
W id wso e n o .f rBMP d c dn rg a i ee t id wse io s s mel c l ain f h yb sn id ws e o igpo rmsi df rn n o dt n , o ai t so ewa yu igW n o e o e n W i o z o t APIod c d t BMP aema eo t A Pd c dn rg a s ie s gs n adC+ n dtetp n p e ft s ay e . T epo a h sa r d u . BM e o igp o r i gv nu i t d 十a ea dse do lz d m n a r h y ii a n h r g m a r g o blyo sp o igmoeB Pf etp s dc mp rt eyf s se d whc r vd s o eee c r ed sg f o o da it f u p r n r M l e o aai l t p e , i t i y n a v a ihpo ie g o rfrn ef e ino c mm o a d o t h n BM Pd c d r. e o es Ke r s BMP; wid ws d c dn ; RLE c mpe so ; fpr w v r ywo d : n o ; e o ig o r sin l i o o e
有如下特 点:
图中的像素 。描述 的像素 以行 为单位进 行组织 , 行所 占的 每 字 节数一般 为 4的倍 数 :
() 5 每个 像素 的信 息可以 由R G、 ( 、 、 3 、 B 红 蓝 绿) 个整 型数
值 描述 , 每个 数值 的大小是 0 25之 间。 -5

BMP格式介绍(一)

BMP格式介绍(一)

BMP格式介绍(⼀)原理篇:⼀、编码的意义。

让我们从⼀个简单的问题开始,-2&-255(中间的操作符表⽰and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的⼈并不多。

这个看起来和图⽚格式没有关系的问题恰恰是图⽚格式的核⼼内容以⾄于整个计算机系统的核⼼内容,多媒体技术虽然没有数据结构,操作系统等计算机基础课所占的地位重,但是在于研究编码⽅⾯有着⾮常重要的地位。

图像其实可以看做⼀种特殊编码过的⽂件。

⼆、从简单的24位bmp开始bmp是最常见也是编码⽅式最简单的图⽚格式,这⾥不说明⼀幅图⽚是怎么显⽰在电脑上的,那不是多媒体技术研究的问题,我们来研究bmp的格式问题,为了使各位能够最快的了解bmp格式,我们从24位的⼀个16*16的⼩图像开始。

我们使⽤常⽤的绘图软件创建⼀个16*16的24位bmp图像,如下图所⽰:可以看到图⽚很⼩,我们使⽤ultra-edit看看其内部是什么(ultra-edit是⼀个⽐记事本更加⾼级的编辑软件,可以在⽹上下载到),我们打开其内部看到的是如下的⼀个⼗六进制的数据⽂件:看起来很⾼深⽽⼜很凌乱的样⼦,我们慢慢地说明这些看起来很凌乱的数据流都代表了什么意思,⾸先我们要说明的是,这⾥⾯⼀个数字代表的是⼀个字节,⽐如头两个数42 4d是两个⼗六进制的数,代表了两个字节。

可以看到在UE中⼀⾏是⼗六个字节。

在具体说明每个字节的含义之前,⾸先需要说明的是字节的排布⽅式,在操作系统和计算机组成结构⾥⾯有⼤端法和⼩端法(如果有遗忘可以查⼀下书),简易的说法是这样的,⼩端法的意思是“低地址村存放低位数据,⾼地址存放⾼位数据”,⼤端法就是反过来的,举个例⼦,如果地址从左到右依次增⼤,那么数据01 02的⼩端法存储⽅式是02 01,⼤端法的存储⽅式就是01 02。

在所有的intel的机器上都是采⽤的⼩端法,⽽⼤端法主要存在于摩托罗拉造的处理器的机器上,所以如果你⽤的是⼀个果粉,⽤的是MAC的话,那么你看到的数据排布⽅式是和我们说明中是相反的。

JPGBMPTIFPNG图像编码压缩率和编解码时间比较

JPGBMPTIFPNG图像编码压缩率和编解码时间比较

JPGBMPTIFPNG图像编码压缩率和编解码时间⽐较Test picture compression format .bmp:Time of reading : 28.68 msTime of writing : 6.79 msTime of decoding : 3.98 msTime of encoding : 4.82 msEncode radio : 100.00% Psnr : 361.20Test picture compression format .jpg:Time of reading : 0.99 msTime of writing : 0.54 msTime of decoding : 19.51 msTime of encoding : 20.15 msEncode radio : 5.77% Psnr : 39.71Test picture compression format .tif:Time of reading : 8.79 msTime of writing : 2.85 msTime of decoding : 70.26 msTime of encoding : 97.59 msEncode radio : 38.89% Psnr : 361.20Test picture compression format .png:Time of reading : 5.53 msTime of writing : 2.38 msTime of decoding : 76.55 msTime of encoding : 216.28 msEncode radio : 32.01% Psnr : 361.20具体测试程序:#include <stdio.h>#include "m_tools.h"#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <fstream>using namespace std;int calPsnr(const string filepath, const char * _ext, double& t_read, double& t_write, double& t_decode, double& t_encode, double& encode_ratio, double & psnr){long long t0 = _getTickCount();cv::Mat src_bmp = cv::imread(filepath);long long t1 = _getTickCount();int w = src_bmp.cols;int h = src_bmp.rows;const std::string ext = _ext;vector<int> opts;if( ext == ".png" ){opts.push_back(cv::IMWRITE_PNG_COMPRESSION);opts.push_back( 9);}else if ( ext == ".jpg" ){opts.push_back(cv::IMWRITE_JPEG_QUALITY);opts.push_back( 90);}else if ( ext == ".bmp" ){}std::vector<uchar> pkg_buff;cv::imencode(ext, src_bmp, pkg_buff, opts);long long t2 = _getTickCount();cv::Mat src_png = cv::imdecode(pkg_buff,CV_LOAD_IMAGE_COLOR);long long t3 = _getTickCount();{FILE* file = fopen((string("dst")+ext).c_str(), "w" );fwrite(&pkg_buff[0],1, pkg_buff.size(), file );fclose(file);}long long t4 = _getTickCount();{std::ifstream f(string("dst")+ext);std::string s;while (f>>s);}long long t5 = _getTickCount();double _psnr= cv::PSNR( src_bmp, src_png );psnr += _psnr;//printf("Psnr of %dx%d%s and %s is %.2f ", w, h, filepath.c_str(), ext.c_str(), _psnr);float src_kb = w*h*3/1024.0;float dst_kb = pkg_buff.size()/1024.0;encode_ratio += dst_kb*100.0/src_kb;//printf("In=%.2fKB Out=%.2fKB Compression ratio=%.2f%\n", src_kb, dst_kb, dst_kb*100.0/src_kb); t_read += (t5-t4)/_getTickFrequency();t_write += (t4-t3) /_getTickFrequency();t_decode += (t3-t2) /_getTickFrequency();t_encode += (t2 - t1) /_getTickFrequency();return0;}int main( int argc, char ** argv ){int max_test_loops = 100;vector<string> paths = getFiles(argv[1]);max_test_loops = paths.size() < max_test_loops? paths.size() : max_test_loops;double t_read=0, t_write=0, t_decode=0, t_encode=0, encode_ratio=0, psnr=0;for( int i=0;i!=max_test_loops; ++i ){calPsnr(paths[i], argv[2], t_read, t_write, t_decode, t_encode, encode_ratio, psnr);}printf("Test picture compression format %s:\n", argv[2]);printf("Time of reading : %.2lf ms\n", 1000.0*t_read/max_test_loops);printf("Time of writing : %.2lf ms\n", 1000.0*t_write/max_test_loops);printf("Time of decoding : %.2lf ms\n", 1000.0*t_decode/max_test_loops);printf("Time of encoding : %.2lf ms\n", 1000.0*t_encode/max_test_loops);printf("Encode radio : %.2lf%% \n", encode_ratio/max_test_loops);printf("Psnr : %.2lf \n\n", psnr/max_test_loops);return0;}。

关于BMP解码为RGB565并在LCD上显示

关于BMP解码为RGB565并在LCD上显示

关于BMP解码为RGB565并在LCD上显⽰开发环境:Keil uVersion5平台:N32903, NonOS, 480x272 LCD⼀. BMP⽂件格式:这⾥主要说说24位BMP。

BMP⽂件的数据按照从⽂件头开始的先后顺序分为四个部分:Ø bmp⽂件头(bmp file header):提供⽂件的格式、⼤⼩等信息Ø 位图信息头(bitmap information):提供图像数据的尺⼨、位平⾯数、压缩⽅式、颜⾊索引等信息Ø 调⾊板(color palette):可选,如使⽤索引来表⽰图像,调⾊板就是索引与其对应的颜⾊的映射表Ø 位图数据(bitmap data):就是图像数据啦^_^下⾯结合Windows结构体的定义,通过⼀个表来分析这四个部分。

我们⼀般见到的图像以24位图像为主,即R、G、B三种颜⾊各⽤8个bit来表⽰,这样的图像我们称为真彩⾊,这种情况下是不需要调⾊板的,也就是所位图信息头后⾯紧跟的就是位图数据了。

因此,我们常常见到有这样⼀种说法:位图⽂件从⽂件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。

这也就解释了我们按照这种程序写出来的程序为什么对某些位图⽂件没⽤了。

⼀、bmp⽂件头Windows为bmp⽂件头定义了如下结构体:typedef struct tagBITMAPFILEHEADER{UINT16 bfType;DWORD bfSize;UINT16 bfReserved1;UINT16 bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;其中:⼆、位图信息头同样地,Windows为位图信息头定义了如下结构体:需要特别注意的是: biHeight不仅代表图⽚的⾼度,还描述了位图是否是熟直倒向的,及如果biHeight为正,则图⽚是颠倒的,解码时需要从下往上解码。

图文并茂嵌入式Linux系统中的图片解码和显示

图文并茂嵌入式Linux系统中的图片解码和显示

图文并茂嵌入式Linux系统中的图片解码和显示嵌入式Linux系统广泛应用于各种物联网设备中,其中涉及到图片的解码和显示功能,是许多应用场景中必不可少的一环。

本文将重点探讨图文并茂嵌入式Linux系统中的图片解码和显示技术,以及实现这些功能所需的方法和工具。

一、图片解码技术在嵌入式Linux系统中,图片解码是将原始的二进制图像数据转换为可显示的图像的过程。

常用的图片格式包括BMP、PNG、JPEG等。

不同格式的图片需要不同的解码方式。

1. BMP格式解码BMP是一种常见的无损的图像格式,其解码相对简单。

解码器可以分析BMP文件的头部信息,获取图像的宽度、高度、位深度等参数,并按照相应的规则将图像数据转换为RGB格式的像素数据。

2. PNG格式解码PNG是一种无损压缩的图像格式,常用于需要保留透明度信息的场景。

PNG格式的解码需要使用libpng等库来实现,库提供了相应的API,可以将PNG文件解码为RGBA格式的像素数据。

3. JPEG格式解码JPEG是一种有损压缩的图像格式,适用于对图像文件大小有严格要求的场景。

JPEG格式的解码需要使用libjpeg等库,解码器可以将JPEG文件逐行解码为YUV格式的像素数据,然后再进行颜色空间转换得到RGB格式的像素数据。

二、图片显示技术图片显示是将解码后的图像数据通过显示设备(如LCD、HDMI等)输出给用户。

嵌入式Linux系统提供了多种方式来实现图片的显示。

1. FramebufferFramebuffer是嵌入式系统中最常用的图片显示方式之一。

Framebuffer是内存中的一个缓冲区,可以直接操作它来显示图像。

在Linux系统中,可以使用/dev/fb0设备来访问Framebuffer,将解码后的RGB格式的像素数据写入到Framebuffer中,即可实现图片的显示。

2. DirectFBDirectFB是一种轻量级的图形库,适用于在嵌入式设备上进行高效的图像和视频渲染。

bmp压缩原理

bmp压缩原理

bmp压缩原理BMP(Bitmap)是一种常见的图像文件格式,它采用无损压缩算法,可以保留图像的每个像素点的精确信息。

那么,BMP压缩的原理是什么呢?BMP压缩的原理是通过减少冗余信息来减小图像文件的大小。

在压缩过程中,主要有两种方法:无损压缩和有损压缩。

无损压缩是指在压缩过程中不会丢失图像的任何信息,压缩后的图像可以完全还原为原始图像。

无损压缩的原理是基于数据的重复性和统计规律。

它通过对图像数据进行编码和解码,利用编码技术来减小文件的大小。

常见的无损压缩算法有Run-length Encoding (RLE)和Lempel-Ziv-Welch(LZW)等。

有损压缩是指在压缩过程中会丢失一部分图像信息,压缩后的图像无法完全还原为原始图像。

有损压缩的原理是通过对图像数据进行适度的抽样和近似处理,以减小文件的大小。

常见的有损压缩算法有JPEG(Joint Photographic Experts Group)和JPEG2000等。

在BMP压缩中,无论是无损压缩还是有损压缩,都需要对图像进行预处理。

预处理的过程包括色彩空间的转换、图像分块、离散余弦变换(DCT)等。

其中,色彩空间的转换是将RGB色彩模型转换为YUV色彩模型,这样可以将亮度和色度分离,从而更好地处理图像的细节和色彩。

无损压缩中的RLE算法是一种简单有效的压缩方法,它通过对图像数据中连续相同的像素值进行计数和编码,从而减少数据的冗余。

例如,一张图上有连续的100个白色像素点,那么RLE算法可以将这个连续的白色像素点表示为“100个白色像素点”,从而减小了文件的大小。

有损压缩中的JPEG算法是一种广泛应用的压缩方法,它通过对图像数据进行分块和DCT变换,再对DCT系数进行量化和编码,最后使用Huffman编码对数据进行进一步压缩。

JPEG算法的关键在于对DCT系数进行量化,通过调整量化表的参数,可以在保证图像视觉质量的前提下减小文件的大小。

BMP文件处理

BMP文件处理

位图和Bitblt位图是一个二维的位数组,此数组的每一个元素与图像的像素一一对应。

现实世界的图像被捕获以后,图像被分割成网格,并以像素作为取样单位。

位图中的每个像素值指明了一个单位网格内图像的平均颜色。

位图代表了Windows程序中存储图像信息的两种方法之一,另一种形式是元文件。

位图也有两种:GDI位图对象和设备无关的位图(DIB: device-independent bitmap)。

位图基础位图常用来表示来自真实世界的复杂图像,元文件更适合于描述由人或者机器生成的图像。

它们都能存于内存或作为文件存于磁盘上,且能通过剪贴板在Windows应用程序间传输。

位图和元文件的区别在于光栅图像和矢量图像间的差别。

光栅图像用离散的像素来处理输出设备;矢量图像用笛卡尔坐标系统来处理输出设备,可在其中绘制线和填充对象。

位图的缺点:1、容易受设备依赖性的影响。

2、位图常暗示了特定的显示分辨率和图像纵横比,在缩放后容易出现失真。

3、存储空间大。

但位图具有处理速度快的优点。

位图可以手工创建,也可计算机代码生成,还可由硬件设备把现实世界输入到计算机,如数码相机,它们通常是使用接触到光就释放电荷的电荷耦合装置(CCD: charge-coupled device)将光的强度转换为电荷,再用模数转换装置(ADC: Analog-to-digital)转换为数字再排列为位图。

位图尺寸位图呈矩形,具有空间尺寸,以像素为单位度量位图的高度和宽度。

以位于图像左上角为位图原点,从0开始计数。

位图的空间尺寸也指定了其分辨率,但此词具有争议,分辨率也指单位长度内的像素数。

位图是矩形的,但内存是线性的。

大多数位图按行存储在内存中,且从顶行像素开始从左到右直到底行结束。

位图还有颜色度量单位:指每个像素所需要的位数,也称颜色深度(color depth)、位数(bit-count)、或位/每像素(bpp: bits per pixel)。

每个像素用1位来描述的位图称为二级(bilevel)、二色(bicolor)或单色(monochrome)位图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//读取文件信息【文件头(14 字节),信息表(40 字节),调色板(不定)】 //真彩图无调色板(所以是 0 字节) //其她图按颜色数来规定调色板的字节数【单色(8),16 色(64),256 色 (1024)】 res = f_read(&file, data, 62, &br);
if (data[0]==0x42 && data[1]==0x4D)
第二部分为位图信息头 BITMAPINFOHEADER,也是一个结构,其定义如 下:
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes;
.bmp 文件解码
WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; 这个结构的长度是固定的,为 40 个字节(LONG 为 32 位整数),各个域的 说明如下: 14 biSize 指定这个结构的长度,为 40。 18 biWidth 指定图象的宽度,单位是象素。 22 biHeight 指定图象的高度,单位是象素。 26 biPlanes 必须是 1,不用考虑。 28 biBitCount 指定表示颜色时要用到的位数,常用的值为 1(黑白二色图), 4(16 色 图), 8(256 色),16(16bit 高彩色), 24(24bit 真彩色),32(32bit 增强型 真彩色)。 30 biCompression 指定位图是否压缩,有效的值为 BI_RGB,BI_RLE8,BI_RLE4, BI_BITFIELDS(都是一些 Windows 定义好的常量)。要说明的是,Windows 位 图可以采用 RLE4,和 RLE8 的压缩格式,但用的不多。我们今后所讨论的只 有第一种不压缩的情况,即 biCompression 为 BI_RGB 的情况。 34 biSizeImage 指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出 来: biSizeImage=biWidth’ × biHeight 要注意的是:上述公式中的 biWidth’必须是 4 的整倍数(所以不是 biWidth,而是 biWidth’,表示大于或等于 biWidth 的,最接近 4 的整倍
(2) 一般来说,.BMP 文件的数据从下到上,从左到右的。也就是说,从 文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个 象素„„接下来是倒数第二行左边第一个象素,左边第二个象素„„依次类 推 ,最后得到的是最上面一行的最右一个象素。
.bmp 文件解码
文件头 信息头
单色位图(320*240)
BYTE rgbBlue;
//该颜色的蓝色分量
BYTE rgbGreen;
//该颜色的绿色分量
BYTE rgbRed;
//该颜色的红色分量
BYTE rgbReserved;
//保留值
} RGBQUAD;
颜色
R
G
B

255
0
0

0
255
0
绿
0
0
255

255
255
0

255
0
255

0
255
255
.bmp 文件解码
} case 4: //16 色
{ break;
} case 8: //256 色
{ break;
} case 16: //16bit 高彩色
{ break;
} case 24: //24bit 真彩色
{
FIL file;
u16 height;
u16 width;
u8 bit_count;
res = f_mount(0, &fs); res = f_open(&file, "stm32.bmp", FA_OPEN_EXISTING | FA_READ); //打开图片 if(res!=FR_OK) printf("bmp 图片错误... ");
50 重要的颜色数 54 白(1) 58 黑(0) 62
0 0XFF、0XFF、0XFF、0X00 0X00、0X00、0X00、0X00 9602 个数据
单色 BMP 格式 黑白图,每个像素只占一位,而颜色表总共有两项,占 8 个字节。故图像数据区的开 始是 0x36 + 8 = 0x3E 字节。 颜色表总是从 0x36=54 字节开始。 00000000 代表黑色,00FFFFFF 代表白色。比如 F0 这样一个字节,实际表示八个像素, 前面四个胃白色,后面四个像素为黑色
0 位图类型 2 文件大小 6 10 文件开始到数据 开始之间的偏移量 14 信息头的长度 18 位图的宽度 22 位图的高度 26
28 像素的位数 30 压缩 34 位图数据的大小 38 水平分辨率 42 垂直分辨率 46 使用的颜色数
‘BM’或 0x42、0x 4D 9664 或 0xc0、0x25、0x00、0x00 0 62 或 0x3e、0x00、0x00、0x00
还有一点也需要注意:Windows 要求每一行的数据的长度必须是 4Bytes 的整 数倍,如果不是,要以值为 0 的字节补充,如果读取的时候不处理,会得到 一个倾斜的图像。
unsigned char data[9604]; FATFS fs; FRESULT res; UINT br; /* *********************************************************** * Function name : Pic_Viewer();
指定目标设备的垂直分辨率,单位同上。 46 biClrUsed
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2。 50 biClrImportant
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重 要的。
第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文

255
255
255

0
0
0

128
128
128
第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就 是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的 R、G、 B 值。下面针对 2 色、16 色、256 色位图和真彩色位图分别介绍。
对于 2 色位图,用 1 位就可以表示该象素的颜色(一般 0 表示黑,1 表示 白),所以一个字节可以表示 8 个象素。
.bmp 文件解码
bmp 文件大体上分成四个部分
位图文件头 BITMAPFILEHEADER 位图信息头 BITMAPINFOHEADER 调色板 Palette 实际的位图数据 ImageDate
第一部分为位图文件头 BITMAPFILEHEADER,是一个结构,其定义如下: typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; 这个结构的长度是固定的,为 14 个字节(WORD 为无符号 16 位整数,
文件头
16bit 高彩色位图
0 位图类型 2 文件大小 6 10 文件开始到数据 开始之间的偏移量
‘BM’或 0x42、0x 4D
0 54 或 0x36、0x00、0x00、0x00
.bmp 文件解码
信息头 实际图像数据
14 信息头的长度 18 位图的宽度 22 位图的高度 26 28 像素的位数 30 压缩 34 位图数据的大小 38 水平分辨率 42 垂直分辨率 46 使用的颜色数 50 重要的颜色数 54
对于 16 色位图,用 4 位可以表示一个象素的颜色,所以一个字节可以 表示 2 个象素。
对于 256 色位图,一个字节刚好可以表示 1 个象素。 对于真彩色图,三个字节才能表示 1 个象素。
要注意两点:
(1) 每一行的字节数必须是 4 的整倍数,如果不是,则需要补齐。这在 前面介绍 biSizeImage 时已经提到了。
件而言的。有些位图,如真彩色图是不需要调色板的,BITMAPINFOHEADER
后直接是位图数据。
调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则
有 2 个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,
其定义如下:
typedef struct tagRGBQUAD {
40 或 0x28、0x00、0x00、0x00 1 或 0x01、0x00 16 或 0x10、0x00
三个字节表示一个像素
BMP 图片的重要特征
数据区里的数据是线性的,行主序,依次是 点一的 B 值,点一的 G 值,点 一的 R 值,点二的 B 值,点二的 G 值,点二的 R 值,等等,需要注意的是, Windows 中普遍采用了行倒向扫描的约定,即,BMP 文件中原点在左下角, 图像矩阵数组第一行实际是图片的最后一行。
//文件格式标记为 BM
{ width = data[18] + (data[19] << 8) + (data[20] << 16) + (data[21] << 24);
相关文档
最新文档