BMP 转 YUV (BMP2YUV)
本文介绍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 (BMP2YUV)相关推荐
- vs2010用c语言实现数据转换成图片,数据压缩第二次实验报告——用C语言实现bmp to yuv的图片格式转化...
实验目标 实验主要要求将图片格式从BMP到YUV的转化,并生成含有至少五幅图片不少于200帧的图像流. 实验原理 一.BMP图像简介: 典型的BMP图像文件由四部分组成(部分摘自360百科对BMP的定 ...
- [数据压缩]_实验① bmp转yuv
文章目录 一. 实验名称 二. 实验目的 三. 实验要求 四. 实验内容 1.典型的BMP图像文件由四部分组成: ① 位图文件头 ② 位图信息头 ③ 调色板 ④ 图像数据字节阵列 2.字节序 五. 实 ...
- 【作业】RGB/BMP转YUV格式及YUV视频拼接
简介 RGB文件 RGB文件是原始的没有压缩的包含红绿蓝三种颜色的图像文件. 常见的RGB格式例如RGB24,也就是一组RGB像素中的R.G.B各占8比特,即一个字节,一组RGB一共是24个比特. 这 ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...
- 图像文件的读写和转换——BMP转YUV
文章目录 数据压缩实验(二) 一.BMP文件格式分析 二.YUV文件格式分析 1.概述 2.YUV采样 Planar平面格式 RGB转YUV 三.实验过程 1.实验思路 2.实验代码 四.实验结果 数 ...
- 格式转换——bmp 2 yuv
一.BMP文件的组成结构 BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用广泛.它采用位映射存储格式,除了图像 ...
- c语言bmp图像YUV转化成RGB,RGB与YUV图像格式的相互转换
RGB与YUV图像格式的相互转换 (参考上的<RGB与YUV图像视频格式的相互转换>文章,做了些修改) RGB介绍:在记录计算机图像时,最常见的是采用RGB(红.绿,蓝)颜色分量来保存颜色 ...
- bmp转yuv格式的视频
代码差不多同学写的 稍微改了下 目的在博客上备份 function bmp2yuv( bmpfile, yuvfile ) img = imread(bmpfile); r = double( i ...
- 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 ...
最新文章
- Rails源码笔记-ActiveSupport-core_ext-date
- IDEA中Maven项目创建单元测试(JUnit4)
- boost::signals2模块实现将参数从信号调用传递到槽的示例程序
- xxl子任务_XXL-JOB v2.0.2,分布式任务调度平台 | 多项特性优化更新
- Robot Framework-Ride界面介绍及库的添加
- 算法(20)-leetcode-剑指offer4
- 抖音去水印解析网址入口_抖音去水印 视频去水印 小工具
- 职场中神奇的程序员,却常常被人说“太直”,这是什么样的思维?
- oracle 显示 中文字体( client的字符集设置,将NLS_LANG改为UTF8即可)
- Linux系统如何把一个文件传递到另一个机器上
- VS2010与VS2012变化的快捷键
- 解析卷积神经网络学习笔记——魏秀参
- 全平台生产力神器-utools
- 高并发软件系统的密码
- 简报 | 菲律宾中央银行已经将数十家数字货币交易所合法化
- 教你如何提高网站排名
- var、let、const的区别
- 小红书推广!如何精准投放小红书KOL
- 乔布斯现身布道iPad 2 中国渠道商降价清库存
- Java各中依赖包介绍