图像处理算法大全(基于libyuv或IPP)----RGB32(ARGB)转成yuv420,RGB24,nv12,yuv422集合

news/2024/7/21 5:30:56 标签: 图像处理, 算法, ffmpeg, 录屏软件, libyuv, dxgi

《周星星教你学ffmpeg》技巧

libyuv源码: 

static void RGB32_2_YUV420(BYTE* pRGBAPtr, BYTE* pYUYVPtr, int width, int height)
{
#ifdef LIBYUV
	uint8_t* yplane = pYUYVPtr;
	uint8_t* uplane = pYUYVPtr + width * height;
	uint8_t* vplane = pYUYVPtr + (width * height*5 / 4);
	int n = libyuv::ARGBToI420( pRGBAPtr, width * 4,yplane, width, uplane, width / 2, vplane, width / 2, width, height);
#else
	DWORD dwTime = ::GetTickCount();
	IppiSize imgSize;
	imgSize.width = width;
	imgSize.height = height;
	Ipp8u* pDes[3] = { pYUYVPtr,pYUYVPtr + height * width * 5 / 4,pYUYVPtr + height * width };
	int Des[3] = { width,width * 1 / 2,width * 1 / 2 };//YUV420->1,1/2,1/2

	int* pInt = Des;
	IppStatus is = ippiBGRToYCrCb420_8u_AC4P3R(pRGBAPtr, width*4, pDes, Des, imgSize);
	if (is != ippStsNoErr)
	{
		return;
	}
#endif
}
static void RGB32_2_YUV422(BYTE* pRGBAPtr, BYTE* pYUYVPtr, int width, int height)//yuv422
{
#ifdef LIBYUV
	int n = libyuv::ARGBToYUY2(pRGBAPtr, width * 4, pYUYVPtr, width*2, width, height);
#else
	DWORD dwTime = ::GetTickCount();
	IppiSize imgSize;
	imgSize.width = width;
	imgSize.height = height;
	IppStatus is = ippiBGRToYCbCr422_8u_AC4C2R(pRGBAPtr, width*4, pYUYVPtr, width*2, imgSize);
	if (is != ippStsNoErr)
	{
		return;
	}
#endif
}
static void RGB32ToNV12(BYTE* pRGBA, BYTE* pNV12, int width, int height)
{
	uint8_t* yplane = pNV12;
	uint8_t* uvplane = pNV12 + width * height;
	int n = libyuv::ARGBToNV12(pRGBA, width * 4, yplane, width, uvplane, width, width,
}

static void RGB32ToRGB24(BYTE *input_rgba, BYTE *output_rgb24, int width, int height)
{
	const int input_stride_rgba = width * 4; // 输入图像的步长,每个像素4字节
	const int output_stride_rgb24 = width * 3; // 输出图像的步长,每个像素3字节
	libyuv::ARGBToRGB24(input_rgba, input_stride_rgba, output_rgb24, output_stride_rgb24,
		width, height);
}

ok!打完收工!


http://www.niftyadmin.cn/n/5038039.html

相关文章

msvcp120.dll丢失怎么办?(五种方法快速解决)

首先,让我们来了解一下msvcp120.dll这个文件。msvcp120.dll是一个动态链接库文件,它是Microsoft Visual C 2012 Redistributable Package的一部分。这个文件的作用是支持一些应用程序的运行,例如游戏、办公软件等。当我们在使用这些软件时&am…

十二、MySql的事务(下)

文章目录 一、事务隔离级别(一)如何理解隔离性(二)隔离级别1.读未提交【Read Uncommitted】:2.读提交【Read Committed】 :3.可重复读【Repeatable Read】:4.串行化【Serializable】: &#xff…

Vue实现大文件分片上传、断点续传

前言 实现大文件分片上传的断点续传以及上传进度条是一个在前端开发中常见且具有挑战性的问题。本篇博客将介绍如何使用Vue框架来实现这个功能,并给出代码示例。 概述 大文件分片上传指的是将一个大文件切割成多个小文件(或称为分片)&…

Python Excel 操作 Openpyxl 模块笔记

xlsx 是 Microsoft Excel 使用的开放 XML 电子表格文件格式的文件扩展名。xlsm 文件支持宏。xlsx 是专有的二进制格式,而 xlsx 是基于 Office Open XML 格式的。 Excel 文件处理 1. 打开 excel 文件 import openpyxl book openpyxl.load_workbook(sample.xlsx)2…

如何管理好一个设计师团队? 优漫动游

1、团队招聘 对于一个设计管理者来说,首先应该保证的设计团队的产出,给予公司其他团队稳定的设计支持。那么做好管理第一件事情就是搭建好你的团队,找到合适的设计师。 如何管理好一个设计师团队? 高水准的设计师是可遇不可求。坐等公…

刷题日记——将x减到0的最小操作数

将x减到0的最小操作数 题目链接:https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/ 题目解读 题目要求移除元素总和等于参数x,这道题给我的第一感觉就是从数组的两边入手,对数据进行加和删除,但是这里有一…

go学习-JS的encodeURIComponent转go

背景 encodeURIComponent() 函数通过将特定字符的每个实例替换成代表字符的 UTF-8 编码的一个、两个、三个或四个转义序列来编码 URI(只有由两个“代理”字符组成的字符会被编码为四个转义序列)。 与 encodeURI() 相比,此函数会编码更多的字…

孤网双机并联逆变器下垂控制策略MATLAB仿真模型

微❤关注“电气仔推送”获得资料 主体模块: 建议使用MATLAB2021b及以上版本打开! 功率计算模块、下垂控制模块、电压电流双环控制模块 系统输出有功功率: 系统输出无功功率: 系统频率变化曲线: 参考文献: 微电网并网运行模式下…