YUV420(YV12,I420)裁剪,画中画算法实现(笔记)
2018-01-05 10:07
120 查看
关于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个算法,以备后用,也希望能帮助到您!
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个算法,以备后用,也希望能帮助到您!
相关文章推荐
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
- YUV420(I420)与YV12的区别,YUV420p与YUV420区别
- YUV转为RGB24及IplImage格式(I420和YV12)及Java版实现
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高) 这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV
- 针对android&ios yuv旋转、镜像、格式转换、裁剪 算法实现
- 针对android&ios yuv旋转、镜像、格式转换、裁剪 算法实现<转>
- 针对android&ios yuv旋转、镜像、格式转换、裁剪 算法实现
- 视频存储格式YUV420 NV12 NV21 i420 YV12
- 算法(第四版)学习笔记之java实现插入排序
- 算法(第四版)笔记<一>-------动态队列的数组实现(Java语言)
- (转)YV12,I420,YUV420P的区别
- YUV转为IplImage格式(I420和YV12)(转)
- YV12,I420,YUV420P的区别
- 《深入理解 Java 虚拟机》- 笔记 - HotSpot 的垃圾收集算法实现
- 客户端网络pomelo学习笔记 (3) node.js 与 c 客户端 Diffie-Hellman 密钥交换算法的实现客户端网络
- 《数据结构与算法——C语言实现》学习笔记——归并排序
- [笔记]BFS算法的python实现
- Hadoop学习笔记二 - kNN算法实现用户风险分类
- 算法笔记(堆实现的最大优先队列)
- 学习笔记——Kaggle_Digit Recognizer (SVM算法 Python实现)