YUV420(YV12,I420)裁剪,画中画算法实现(笔记)

关于RGB和YUV的数据排列不再累述,百度很多。

YV12,I420同属YUV420P,加了一个P的意思,我理解为把Y,U,V分量按块排列,即YYYYYYYY  UU  VV这样。YV12,I420的区别在于U和V的位置颠倒而已。

直接贴代码吧:

1、裁剪算法:

static void Cut_YV12(BYTE* Src,int x,int y,int srcWidth,int srcHeight,BYTE* Dst,int desWidth,int desHeight)//图片按位置裁剪
{
	//得到B图像所在A的坐标
	int nIndex=0;
	int BPosX=x ;//列
	int BPosY=y;//行
	for(int i=0;i<desHeight;i++)//
	{	
		memcpy(Dst+desWidth*i,Src+(srcWidth*BPosY)+BPosX+nIndex,desWidth);
		nIndex+=(srcWidth);
	}

	nIndex=0;
	BYTE *pUSour=Src+srcWidth*srcHeight;
	BYTE *pUDest=Dst+desWidth*desHeight;
	for(int i=0;i<desHeight/2;i++)//
	{	
		memcpy(pUDest+desWidth/2*i,pUSour+(srcWidth/2*BPosY/2)+BPosX/2+nIndex,desWidth/2);
		nIndex+=(srcWidth/2);
	}

	nIndex=0;
	BYTE *pVSour=Src+srcWidth*srcHeight*5/4;
	BYTE *pVDest=Dst+desWidth*desHeight*5/4;
	for(int i=0;i<desHeight/2;i++)//
	{	
		memcpy(pVDest+desWidth/2*i,pVSour+(srcWidth/2*BPosY/2)+BPosX/2+nIndex,desWidth/2);
		nIndex+=(srcWidth/2);
	}

}
上面是YV12的算法,如果是I420,直接把U和V分量交换下即可。

2、画中画算法:

static void PicIn_YV12(BYTE* Src,int x,int y,int srcWidth,int srcHeight,BYTE* Dst,int desWidth,int desHeight)//图片按位置合并
{
	if(x+srcWidth>desWidth)//越界
		return;
	if(y+srcHeight>desHeight)//越界
		return;

	//得到B图像所在A的坐标
	int nIndex=0;
	int BPosX=x ;//列
	int BPosY=y;//行
	for(int i=0;i<srcHeight;i++)//
	{	
		memcpy(Dst+(desWidth*BPosY)+BPosX+nIndex,Src+(srcWidth*i),srcWidth);
		nIndex+=(desWidth);
	}

	nIndex=0;
	BYTE *pUSour=Src+srcWidth*srcHeight;
	BYTE *pUDest=Dst+desWidth*desHeight;
	for(int i=0;i<srcHeight/2;i++)//
	{	
		memcpy(pUDest+(desWidth/2*BPosY/2)+BPosX/2+nIndex,pUSour+(srcWidth/2*i),srcWidth/2);
		nIndex+=(desWidth/2);
	}

	nIndex=0;
	BYTE *pVSour=Src+srcWidth*srcHeight*5/4;
	BYTE *pVDest=Dst+desWidth*desHeight*5/4;
	for(int i=0;i<srcHeight/2;i++)//
	{	
		memcpy(pVDest+(desWidth/2*BPosY/2)+BPosX/2+nIndex,pVSour+(srcWidth/2*i),srcWidth/2);
		nIndex+=(desWidth/2);
	}

}
上面是YV12的算法,如果是I420,直接把U和V分量交换下即可。

上面2个算法均未考虑奇数宽高的情况,所以,输入的值应该均为偶数,保证完全正确应该考虑补位的情况,先不管这些了。记录下这2个算法,以备后用,也希望能帮助到您!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周星星的星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值