本文介绍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

RGB到色差信号的转换如下所示:
Y=0.2990R+0.5870G+0.1140B
R-Y=0.7010R-0.5870G-0.1140B
B-Y=-0.2990R-0.5870G+0.8860B

为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为:

U=-0.1684R-0.3316G+0.5B
V=0.5R-0.4187G-0.0813B

YUV文件的格式

转换后的YUV数据需要存成YUV文件(在这里是YUV420P格式)。YUV文件的格式很简单,先连续存Y,然后U,然后V,如图所示。

BMP 转 YUV程序下载地址:http://download.csdn.net/detail/leixiaohua1020/6469807

BMP 转 YUV (BMP2YUV)相关推荐

  1. vs2010用c语言实现数据转换成图片,数据压缩第二次实验报告——用C语言实现bmp to yuv的图片格式转化...

    实验目标 实验主要要求将图片格式从BMP到YUV的转化,并生成含有至少五幅图片不少于200帧的图像流. 实验原理 一.BMP图像简介: 典型的BMP图像文件由四部分组成(部分摘自360百科对BMP的定 ...

  2. [数据压缩]_实验① bmp转yuv

    文章目录 一. 实验名称 二. 实验目的 三. 实验要求 四. 实验内容 1.典型的BMP图像文件由四部分组成: ① 位图文件头 ② 位图信息头 ③ 调色板 ④ 图像数据字节阵列 2.字节序 五. 实 ...

  3. 【作业】RGB/BMP转YUV格式及YUV视频拼接

    简介 RGB文件 RGB文件是原始的没有压缩的包含红绿蓝三种颜色的图像文件. 常见的RGB格式例如RGB24,也就是一组RGB像素中的R.G.B各占8比特,即一个字节,一组RGB一共是24个比特. 这 ...

  4. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...

  5. 图像文件的读写和转换——BMP转YUV

    文章目录 数据压缩实验(二) 一.BMP文件格式分析 二.YUV文件格式分析 1.概述 2.YUV采样 Planar平面格式 RGB转YUV 三.实验过程 1.实验思路 2.实验代码 四.实验结果 数 ...

  6. 格式转换——bmp 2 yuv

    一.BMP文件的组成结构 BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用广泛.它采用位映射存储格式,除了图像 ...

  7. c语言bmp图像YUV转化成RGB,RGB与YUV图像格式的相互转换

    RGB与YUV图像格式的相互转换 (参考上的<RGB与YUV图像视频格式的相互转换>文章,做了些修改) RGB介绍:在记录计算机图像时,最常见的是采用RGB(红.绿,蓝)颜色分量来保存颜色 ...

  8. bmp转yuv格式的视频

    代码差不多同学写的  稍微改了下  目的在博客上备份 function bmp2yuv( bmpfile, yuvfile ) img = imread(bmpfile); r = double( i ...

  9. bmp转YUV RGB转YUV HM学习

    Y = 0.299 R + 0.587 G + 0.114 B U = - 0.1687 R - 0.3313 G + 0.5 B + 128 V = 0.5 R - 0.4187 G - 0.081 ...

最新文章

  1. Rails源码笔记-ActiveSupport-core_ext-date
  2. IDEA中Maven项目创建单元测试(JUnit4)
  3. boost::signals2模块实现将参数从信号调用传递到槽的示例程序
  4. xxl子任务_XXL-JOB v2.0.2,分布式任务调度平台 | 多项特性优化更新
  5. Robot Framework-Ride界面介绍及库的添加
  6. 算法(20)-leetcode-剑指offer4
  7. 抖音去水印解析网址入口_抖音去水印 视频去水印 小工具
  8. 职场中神奇的程序员,却常常被人说“太直”,这是什么样的思维?
  9. oracle 显示 中文字体( client的字符集设置,将NLS_LANG改为UTF8即可)
  10. Linux系统如何把一个文件传递到另一个机器上
  11. VS2010与VS2012变化的快捷键
  12. 解析卷积神经网络学习笔记——魏秀参
  13. 全平台生产力神器-utools
  14. 高并发软件系统的密码
  15. 简报 | 菲律宾中央银行已经将数十家数字货币交易所合法化
  16. 教你如何提高网站排名
  17. var、let、const的区别
  18. 小红书推广!如何精准投放小红书KOL
  19. 乔布斯现身布道iPad 2 中国渠道商降价清库存
  20. Java各中依赖包介绍

热门文章

  1. 转帖节选:卓有成效的管理者(彼得.德鲁克)
  2. [转]Unix awk完全使用手册
  3. CCF202104-1 灰度直方图(100分)【计数】
  4. Bailan4142 二分法求函数的零点【二分法】
  5. Bailian3704 扩号匹配问题【堆栈】
  6. POJ NOI0113-6 最长单词2【文本处理】
  7. 圆上的定理 —— 圆周角定理与相交弦定理
  8. GPS 的物理数学原理
  9. for 循环 and while 循环(三)
  10. 比大小 log_2^3 与 log_3^5