本文介绍BMP 转 YUV。其实这是以前“数据压缩”实验课上的内容,前几天有人问我相关的问题,突然发现自己有一段时间没有接触BMP也有些生疏了,因此翻出资料总结一下。
BMP文件格式解析
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。BMP位图文件默认的文件扩展名是bmp或者dib。BMP文件大体上分为四个部分:
位图文件头主要包括:
typedef struct tagBITMAPFILEHEADER { WORD bfType; /* 说明文件的类型 */ DWORD bfSize; /* 说明文件的大小,用字节为单位 */ WORD bfReserved1; /* 保留,设置为0 */ WORD bfReserved2; /* 保留,设置为0 */ DWORD bfOffBits; /* 说明从BITMAPFILEHEADER结构开始到实际的图像数据之间的字节偏移量 */ } BITMAPFILEHEADER;
位图信息头主要包括:
typedef struct tagBITMAPINFOHEADER { DWORD biSize; /* 说明结构体所需字节数 */ LONG biWidth; /* 以像素为单位说明图像的宽度 */ LONG biHeight; /* 以像素为单位说明图像的高速 */ WORD biPlanes; /* 说明位面数,必须为1 */ WORD biBitCount; /* 说明位数/像素,1、2、4、8、24 */ DWORD biCompression; /* 说明图像是否压缩及压缩类型BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS */ DWORD biSizeImage; /* 以字节为单位说明图像大小,必须是4的整数倍*/ LONG biXPelsPerMeter; /*目标设备的水平分辨率,像素/米 */ LONG biYPelsPerMeter; /*目标设备的垂直分辨率,像素/米 */ DWORD biClrUsed; /* 说明图像实际用到的颜色数,如果为0,则颜色数为2的biBitCount次方 */ DWORD biClrImportant; /*说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。*/ } BITMAPINFOHEADER;
调色板实际上是一个数组,它所包含的元素与位图所具有的颜色数相同,决定于biClrUsed和biBitCount字段。数组中每个元素的类型是一个RGBQUAD结构。真彩色无调色板部分。
typedef struct tagRGBQUAD { BYTE rgbBlue; /*指定蓝色分量*/ BYTE rgbGreen; /*指定绿色分量*/ BYTE rgbRed; /*指定红色分量*/ BYTE rgbReserved; /*保留,指定为0*/ } RGBQUAD;
紧跟在调色板之后的是图像数据字节阵列。对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值(逻辑色)。对于真彩色图,图像数据就是实际的R、G、B值。图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。规定每一扫描行的字节数必需是4的整倍数,也就是DWORD对齐的。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。
读取BMP文件,提取RGB数据的流程
流程如下图所示:
在这里需要注意的的是,根据BMP每像素所占的比特数不同(8,16,32 bpp),分为不同的处理方法,如下图所示。
下面看看16bpp的BMP文件操作:
R,G,B在16bit中所占的位数如下图所示
for (Loop = 0;Loop < height * width;Loop +=2) { *rgbDataOut = (Data[Loop]&0x1F)<<3; *(rgbDataOut + 1) = ((Data[Loop]&0xE0)>>2) + ((Data[Loop+1]&0x03)<<6); *(rgbDataOut + 2) = (Data[Loop+1]&0x7C)<<1; rgbDataOut +=3; }
1-8bpp的BMP文件操作:
int shiftCnt = 1; while (mask) { unsigned char index = mask == 0xFF ? Data[Loop] : ((Data[Loop] & mask)>>(8 - shiftCnt * info_h.biBitCount)); * rgbDataOut = pRGB[index].rgbBlue; * (rgbDataOut+1) = pRGB[index].rgbGreen; * (rgbDataOut+2) = pRGB[index].rgbRed; if(info_h.biBitCount == 8) mask = 0; Else mask >>= info_h.biBitCount; rgbDataOut+=3; shiftCnt ++; }
BMP转换为YUV
为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为:
YUV文件的格式
转换后的YUV数据需要存成YUV文件(在这里是YUV420P格式)。YUV文件的格式很简单,先连续存Y,然后U,然后V,如图所示。
BMP 转 YUV程序下载地址:http://download.csdn.net/detail/leixiaohua1020/6469807
相关推荐
"Bmp转YUV工具"就是一种专门用来转换BMP图像到YUV格式的软件。这类工具通常包括以下功能: 1. **读取BMP文件**:工具首先会读取BMP文件的头信息,解析图像的宽度、高度、位深度等参数。 2. **颜色空间转换**:BMP...
`bmp2dat.c`是主要的源代码文件,其中包含了读取BMP文件并转换为YUV420格式的函数。首先,代码会解析BMP文件头,获取图像的宽度、高度、位深度等信息。然后,它会逐行读取RGB像素数据,并根据YUV颜色空间转换公式将...
2. **JPEG转YUV**: JPEG图像已经经过了颜色空间变换,可能已经是YCbCr(JPEG标准中的YUV)。解码JPEG图像时,会得到Y、Cb、Cr三个分量,可以直接按照NV12格式排列。如果原图像不是YCbCr,则需要先解码为RGB,然后...
2. **读取像素数据**:BMP文件的像素数据通常是按行存储的,且每行以字节对齐。C程序需要根据位深度(通常为24位),逐行读取像素数据,并将其存储到适当的数据结构中。 3. **转换到YUV格式**:BMP的RGB数据需要...
YUV有多种子格式,如YUV4:2:0、YUV4:2:2和YUV4:4:4,不同子格式的色度采样率不同,对带宽和压缩效率有直接影响。 BMP到YUV的转换主要涉及以下几个步骤: 1. 读取BMP文件:解析BMP文件头,获取图像的宽度、高度、位...
在计算机图形处理领域,图像文件通常有多种不同的格式,例如BMP(Bitmap)和YUV。BMP是一种无损的位图格式,广泛用于Windows操作系统,而YUV则是一种常用的视频编码格式,常用于数字视频处理和编码。本文将详细讨论...
本篇文章将详细讲解YUV到BMP以及BMP到YUV420的转换过程,同时探讨这两种格式的特点和它们在不同场景中的应用。 首先,我们来看YUV颜色空间。YUV主要用于电视和视频系统,因为它能够有效地减少存储和传输数据量。Y...
在计算机图形学和视频编码领域,BMP(Bitmap)是一种常见的位图文件格式,而YUV420则是一种用于视频编码的色彩空间。本文将详细介绍如何使用CUDA和DirectX编程技术将BMP图片转换为YUV420格式。 首先,让我们了解BMP...
在数字图像处理领域,BMP和YUV是两种常见的图像格式。BMP(Bitmap)是Windows操作系统中广泛使用的位图格式,而YUV则是一种为视频压缩设计的颜色空间,常见于数字电视和视频编码中。本教程将详细阐述如何在Linux环境...
BMP转YUV操作在多媒体编码、视频处理、流媒体传输等领域非常常见,因为YUV格式能够更好地适应这些场景的需求,如低带宽传输、硬件加速解码等。 总之,从BMP到YUV的转换是一个涉及到图像格式解析、颜色空间转换、...
`yuv2bmp`是一个基于MFC(Microsoft Foundation Classes)实现的实用小工具,它的主要功能是将YUV视频序列转换为BMP位图文件。在深入探讨这个工具之前,我们先来了解一下YUV和BMP格式的基础知识。 **YUV格式**:YUV...
BMP转YUV matlab程序,自己写的程序
**BMPTOYUV C语言代码** 在计算机图形学领域,图像处理是不可或缺的一部分,而BMP和YUV是两种常见的图像格式。本项目提供了一种C语言实现,用于将位图BMP文件转换为YUV文件。这个过程涉及到图像颜色空间的转换,对...
在提供的压缩包中,`bmp2yuv420`可能是包含源代码和执行文件的项目,通过运行它,你可以直接将BMP文件转换为YUV420格式,这对于HEVC/h.265的学习和实践非常有帮助。HEVC标准在编码过程中大量使用YUV420格式,理解...
在数字图像处理领域,BMP(Bitmap)和YUV是两种常见的图像格式。BMP是Windows操作系统中的位图文件格式,通常用于存储未压缩的像素...通过"bmp2yuv"这样的工具,我们可以轻松实现这种转换,满足特定的应用场景需求。
在压缩包"yuv转bmp-yuv转jpg源码"中,包含了实现这两个转换的源代码。源码可能包括解析YUV文件、执行色彩空间转换、编写BMP和JPEG文件头以及应用压缩算法的函数。开发者可以参考这些源码,了解转换过程的详细实现,...
将标准BMP24的图像 一次性生成 RGB32 RGB24 RGB16 GRAY RGB4444 RGB5551 YUV422 YUV444COM YUV444SEP YUV420 Y_UV22 Y_UV20 YUV422SEP 等格式的二进制文件 是制作UI和测试LCDC的好工具 Y_UV20 为simi planar 即...
"bmp转YUV工具"如“BmpTransfer.exe”,主要功能就是将BMP图像转换成YUV格式,这对于视频编码、解码、实时处理等场景尤其有用。例如,在开发视频编解码软件时,为了减少内存占用和提高处理速度,通常会将BMP图像先...
在图像处理领域,色彩空间转换是一项...总的来说,JPG和BMP转YUV涉及到图像处理的基础知识,包括文件格式解析、色彩空间转换和数据存储策略。这个过程在多媒体编码、图像处理算法以及嵌入式系统设计中都有重要应用。
2. **色彩空间转换**:将YUV数据转换为RGB(红绿蓝)色彩空间,因为BMP格式存储的是RGB像素。 3. **创建BMP头信息**:根据图像尺寸和色彩深度,生成符合BMP文件格式的头部信息。 4. **像素数据重组**:按照BMP格式的...