BMP到YUV

这篇具有很好参考价值的文章主要介绍了BMP到YUV。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

将BMP文件转换成YUV文件


一、RGB到YUV格式的转换

RGB文件的格式为,每个像素占三个字节,依次为B G R三个分量。根据亮度方程,即可计算出每个像素对应的Y U V.
YUV图片的采样格式为4:2:0 如下表

所以UV所占的大小都为Y的四分之一。

	yBufferOut = (unsigned char*)malloc(height * width);
	uBufferOut = (unsigned char*)malloc(height * width /4);
	vBufferOut = (unsigned char*)malloc(height * width /4);

按亮度方程计算三个分量,并写入新文件。

for (int i = 0; i < height * width; i++)
	{
		*(yBufferOut + i) = (int)(0.299 * ( * (rBufferIn + i)) + 0.587 *( * (gBufferIn + i) )+ 0.114 *( * (bBufferIn + i)));
	}


	
	for (int i = 0,j=0; i < height * width;j++)
	{
		*(uBufferOut + j) = ((-0.1684) * (*(rBufferIn + i)) + (-0.3316) * (*(gBufferIn + i)) + 0.5 * (*(bBufferIn + i)) + 128);
							
		if (i % width == width - 2)
		{
			i = i + width + 2;
		}
		else 
		{
			i = i + 2;
		}
	}

	for (int i =0,j=0; i < height * width;j++ )
	{
		*(vBufferOut +j) =	((0.5) * *(rBufferIn + i + 256) + (-0.4187) * *(gBufferIn + i + 256) + (-0.0813) * *(bBufferIn + i + 256) + 128);
		
		if (i % width == width - 2)
		{
			i = i + width + 2;
		}
		else
		{
			i = i + 2;
		}
	}

效果
BMP到YUV


二、BMP到YUV格式的转换

1.BMP文件的格式

典型的BMP图像文件由四部分组成:
(1)位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
(2)位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
(3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
(4)位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

typedef struct tagBITMAPFILEHEADER
{
	unsigned short int  bfType;       //位图文件的类型,必须为BM 
	unsigned long       bfSize;       //文件大小,以字节为单位
	unsigned short int  bfReserverd1; //位图文件保留字,必须为0 
	unsigned short int  bfReserverd2; //位图文件保留字,必须为0 
	unsigned long       bfbfOffBits;  //位图文件头到数据的偏移量,以字节为单位
}BITMAPFILEHEADER;               //定义位图信息头块

typedef  struct  tagBITMAPINFOHEADER
{
	long biSize;                        //该结构大小,字节为单位
	long  biWidth;                      //图形宽度以象素为单位
	long  biHeight;                     //图形高度以象素为单位
	short int  biPlanes;                //目标设备的级别,必须为1 
	short int  biBitcount;              //颜色深度,每个象素所需要的位数
	short int  biCompression;           //位图的压缩类型
	long  biSizeImage;                  //位图的大小,以字节为单位
	long  biXPelsPermeter;              //位图水平分辨率,每米像素数
	long  biYPelsPermeter;              //位图垂直分辨率,每米像素数
	long  biClrUsed;                    //位图实际使用的颜色表中的颜色数
	long  biClrImportant;               //位图显示过程中重要的颜色数
}BITMAPINFOHEADER;                 //定义位图信息头块



typedef struct tagRGBQUAD 
{
	unsigned char rgbBlue;     //指定蓝色分量
	unsigned char rgbGreen;    //指定绿色分量
	unsigned char rgbRed;      //指定红色分量
	unsigned char rgbReserved; //保留, 指定为 0
} RGBQUAD;


typedef  struct bmp
{
	BITMAPFILEHEADER  file; //文件信息区
	BITMAPINFOHEADER  info; //图象信息区
}bmp;

2.BMP中RGB数据的提取

首先我们要判断是几位的图片。如果是24位图,直接提取RGB数据即可。如果不是,则需要按照调色板来获取。

判断是否需要调色板

int JudgeQuad(BITMAPFILEHEADER FileHeader, BITMAPINFOHEADER InfoHeader, FILE* BmpFile, RGBQUAD* RGBQuadOut)
{
	if ((FileHeader.bfbfOffBits-sizeof(BITMAPFILEHEADER)-InfoHeader.biSize)==sizeof(RGBQUAD)*pow(2,InfoHeader.biBitcount))
	{
		fseek(BmpFile, sizeof(BITMAPFILEHEADER) + InfoHeader.biSize, 0);
		fread(RGBQuadOut, sizeof(RGBQUAD),(unsigned int)pow(2,(float)InfoHeader.biBitcount), BmpFile);
		return 1;
	}
	else
	{
		return 0;
	}
}

之后我们提取文件中的RGB数据,注意字节序,BMP的数据放到RGB中要反序

for (int k = 0; k < Height; k++)
		{
			for (int p = 0; p < Width; p++)
			{
				*(RGBBufferOut + k * Width + p) = *(BmpDataBuffer + (Height - 1 - k) * Width + p);

			}
		}
		free(BmpDataBuffer);

得到RGB数据之后,我们再执行RGB到YUV 的转化就可以了。
下面是猫猫头效果图

BMP到YUV

主函数调用:文章来源地址https://www.toymoban.com/news/detail-409501.html

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include"bmp.h"


bmp ReadBmpFile(char* file);

int bmp2rgb(BITMAPFILEHEADER FileHeader, BITMAPINFOHEADER InfoHeader, FILE* BmpFile, unsigned char* RGBBuffer);
int rgb2yuv(BITMAPINFOHEADER InfoHeader, unsigned char* RGBBufferIn, unsigned char* yBufferOut, unsigned char* uBufferOut, unsigned char* vBufferOut);
int main(int argc, char* argv[])
/*  
	1 out.yuv
	2 frame
-----以下是文件------
	3 bixin.bmp
	4 gucci.bmp 
	5 daoren.bmp 
	6 zhenshi.bmp 
	7 zaoan.bmp  
	
	        */
{

	FILE* fout = fopen(argv[1], "wb");

	for (int i = 3; i < argc; i++)
	{
		FILE* fp;
		
		bmp  temp = ReadBmpFile(argv[i]);
		
		fp = fopen(argv[i], "rb");

		unsigned long Width, Height; //图像的宽(像素数)与高(像素数)
		Height = temp.info.biHeight;
		Width = temp.info.biWidth;

		printf("%d\n", Height);

		unsigned char* RGBBuffer;

		RGBBuffer = (unsigned char*)malloc(3 * Width * Height);
		bmp2rgb(temp.file, temp.info, fp, RGBBuffer);

		printf("已转化成rgb");

		unsigned char* yBufferOut;
		unsigned char* uBufferOut;
		unsigned char* vBufferOut;
		yBufferOut = (unsigned char*)malloc(Width * Height);
		uBufferOut = (unsigned char*)malloc(Width * Height / 4);
		vBufferOut = (unsigned char*)malloc(Width * Height / 4);


		rgb2yuv(temp.info, RGBBuffer, yBufferOut, uBufferOut, vBufferOut);

		for (int j = 0; j < atoi(argv[2]); j++)
		{
			fwrite(yBufferOut, sizeof(unsigned char), Width * Height, fout);
			fwrite(uBufferOut, sizeof(unsigned char), Width * Height / 4, fout);
			fwrite(vBufferOut, sizeof(unsigned char), Width * Height / 4, fout);
		}
		free(yBufferOut);
		free(uBufferOut);
		free(vBufferOut);
		
		fclose(fp);
	}

	return 0;

}

到了这里,关于BMP到YUV的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 经过前面三章的学习,我们快要完成我们的目标任务了:使用 ffmpeg

    2024年02月12日
    浏览(48)
  • 2022/7 用python批量将.mat文件转为.jpg/.png/.bmp格式图片

    网上看了一个下午都没找到能用的。。。抄来抄去都没说到点子上 mat文件是Matlab的数据存储的标准格式。 涉及到文件转换肯定要看数据的结构, 事实上别人的代码很难成功就是因为大家的mat文件的数据结构各不相同 照着这个一步一步来你肯定可以学会 1、第一段代码,包括

    2023年04月09日
    浏览(46)
  • OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色

    glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法: x 和 y:读取区域左下角的像素坐标。 width 和 height:读取区域的宽度和高度。 format:像素数据的格式,可以是 GL_RGBA、

    2024年02月10日
    浏览(36)
  • photoshop不能保存bmp格式

    使用位图进行深度学习的特征点标定时间比正常图片格式的时间要缩短一半,所以使用ps新增异常点。但是新增图层后无法保存bmp的格式 只有单图的时候才可以保存为bmp的格式,有图层的状态无法保存

    2024年02月11日
    浏览(39)
  • 关于bmp、jpg格式图片的解码

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、为什么要解码? 二、bmp图片 1.bmp图片信息 2.获取图片信息 三、jpg图片  总结         在学习C语言、文件IO、数据结构之后做了一个6818的开发板项目,自觉想要记录

    2024年02月06日
    浏览(33)
  • bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

    目录 一、概述 二、 .bmp 格式文件详解  2.1 位图文件头  2.2 位图信息头  2.3 调色板  2.4 位图数据 三、位图的其他知识  3.1 压缩的位图 bmp 是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,随着windows的流行, bmp 位图格式被广泛应用。 位图按照 是

    2023年04月18日
    浏览(37)
  • RAW、RGB、YUV 图像格式区别

    颜色是人的视觉系统对光谱中可见区域的感知效果,它仅存在于人的眼睛和大脑中。为了准确地描述颜色,必须引入色彩空间的概念。正如几何上用坐标空间来描述坐标集合,色彩空间用数学方式来描述颜色集合。 RAW 图像就是图像感应器将捕捉到的光源信号转化为数字信号

    2024年02月04日
    浏览(33)
  • OpenCV中的RGB与YUV转换

            YUV 颜色空间从模拟电视时代开始就被广泛应用于彩色图像的转换与处理。其基于一个 3x3 的矩阵,通过线性变换将 RGB 像素转换为一个亮度(Luma)分量 Y 以及两个色度(Chroma)分量 U 和 V。由于模拟电视存在着多种制式,如 NTSC 与 PAL 等等,考虑到具体硬件与技术上的

    2024年02月14日
    浏览(24)
  • Vue中如何进行文件转换与格式转换

    在Web应用程序中,经常需要进行文件转换和格式转换。例如,将PDF文件转换为图像文件、将音频文件转换为不同的格式或将视频文件转换为不同的分辨率和编解码格式。Vue作为一种流行的前端框架,提供了许多实用工具和库,可以帮助我们在应用程序中进行文件转换和格式转

    2024年02月09日
    浏览(37)
  • YUV格式的图片查看工具YUView 2.13

    YUV格式的图片查看工具YUView 2.13 参考资料:                Image to YUV (ffmpeg/ImageMagick) 这2个工具可用于音视频格式转换等处理                Image to YUV (ffmpeg/ImageMagick)_hushui的博客-CSDN博客                FFmpeg常用命令/参数                https://blog.csdn.net/weixin_3681132

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包