剪裁NV21任意一部分的代码

简介: 剪裁NV21任意一部分的代码

NV21是YUV格式的,比例是411。Y对应每个像素,这个好办。每个U、V对应4个像素,这个怎么复制?试着改了代码,内容出来了,颜色基本都错了。


 网上搜索了半天,都是缩放方面的。也不知道有没有测试过?能不能跑?结果对不对?


 反复搜索了几次,终于找到了一个剪切的代码,是JAVA的,而且写法跟吾差别很大。可是没有别的参考,有这个也很好了。于是自己研究了代码,发现原理、流程是一样的(那是肯定的)。有一个步骤代码有些差异,做了修改,直接崩溃。仔细看了,对照自己代码,再修改,这次有不少的画面正确,也有错误(自己的代码,之前也出现过类似情况)。


 这是怎么回事呢?同样的代码,怎么有的图片对,有的不对?吾使出以前用过的办法,将每个图片的剪切区域打印出来,进行分析。果然发现了规律:相对于源图片的TOP、LEFT必须都是偶数,图片就正确。那就好说了,咱玩这个多熟练啊。这里把正确的代码开放出来,希望对于为此苦恼的朋友有帮助。

int clipNv21ToNv21(const char* pNv21Source,  const int nWidth, const int nHeight,
    char* pNv21Dest,  const int nClipLeft, const int nClipTop, const int nClipWidth, const int nClipHeight)
{
    const char* pNv21Source0 = pNv21Source;
    int i = 0;
    //关键二之一。
    //取整。估计不同平台要求取整范围有差异。
    //这样计算的结果,有可能差一个像素。宽高最好对应调整。
    int clipLeft = (int)(nClipLeft+1)  / 2 * 2;
    int clipTop  = (int)(nClipTop +1)  / 2 * 2;
    //移动到指定位置
    pNv21Source0 += clipTop * nWidth + clipLeft;
    //复制Y
    for (i=0; i<nClipHeight; i++)
    {
        memcpy(pNv21Dest, pNv21Source0, nClipWidth);
        pNv21Source0 += nWidth;
        pNv21Dest    += nClipWidth;
    }
    //复制U/V
    pNv21Source0  = pNv21Source + nWidth*nHeight;
    pNv21Source0 += (clipTop * nWidth/2 + clipLeft);
    //关键二之二:
    for (i=0; i<nClipHeight/2; i++)
    {
        memcpy(pNv21Dest, pNv21Source0, nClipWidth);
        pNv21Source0 += nWidth;
        pNv21Dest    += nClipWidth;
    }
    return 0;
}
目录
相关文章
|
10月前
|
边缘计算 运维 Cloud Native
浙江省科技进步奖一等奖!阿里云云原生技术实现新突破
科技成果鉴定委员会高度评价该技术,“项目研发难度大,成果创新性强,对促进关键技术进步及自主可控具有重大意义,成果在国内外开源社区产生了广泛影响,并成功应用于互联网、交通、金融、物流、医疗等多个行业。”
489 12
|
运维 IDE Java
SOA(面向服务架构)是什么?
SOA(面向服务架构)是什么?
3172 0
SOA(面向服务架构)是什么?
【Pandas+Python】初始化一个全零的Dataframe
初始化一个100*3的0矩阵,变为Dataframe类型,并为每列赋值一个属性。
199 2
|
机器学习/深度学习 存储 算法
C# | 凸包算法之Graham,快速找到一组点最外侧的凸多边形
这篇关于凸包算法的文章,本文使用C#和Graham算法来实现凸包算法。 首先消除两个最基本的问题: 什么是凸包呢? 凸包是一个包围一组点的凸多边形。凸多边形是指多边形中的每个内角都小于180度的多边形。 凸包算法有什么用呢? 凸包算法的作用是找到这个凸多边形,并且使用最少的点来绘制出它的轮廓。凸包算法在计算机图形学、计算几何和机器学习等领域中有着广泛的应用。
313 0
|
机器学习/深度学习 传感器 编解码
【编码译码】基于matlab实现LDPC编码和解码
【编码译码】基于matlab实现LDPC编码和解码
|
Linux
【Linux信号专题】五、SIGCHLD信号详解
【Linux信号专题】五、SIGCHLD信号详解
478 0
|
机器学习/深度学习 算法 Serverless
冷启动优化:厂商对冷启动问题的优化
冷启动优化:厂商对冷启动问题的优化
612 0
|
机器学习/深度学习 编解码 算法
大淘宝技术发布首个基于神经渲染的3D建模产品Object Drawer,现已向学术界与普通用户开放
大淘宝技术发布首个基于神经渲染的3D建模产品Object Drawer,现已向学术界与普通用户开放
2540 0
大淘宝技术发布首个基于神经渲染的3D建模产品Object Drawer,现已向学术界与普通用户开放
|
SQL 数据可视化 BI
使用SqlServer建立数据仓库
本文介绍了一个数据仓库从无到有的建立过程,包括设计维度表、事实表,数据抽取,数据可视化。使用SQlServer2008R2制作,数据源为Mysql官方示例数据集。
12050 1