剪裁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;
}
目录
相关文章
|
1月前
|
人工智能 UED
DynamiCrafter:可实现任意类型静态图像转化为逼真动态视频
【2月更文挑战第17天】DynamiCrafter:可实现任意类型静态图像转化为逼真动态视频
135 1
DynamiCrafter:可实现任意类型静态图像转化为逼真动态视频
|
3月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
32 0
|
7月前
Shader显示模型外轮廓线
Shader显示模型外轮廓线
|
8月前
|
BI C#
你听我说-HandyControl混搭LiveCharts图形路径偏移
你听我说-HandyControl混搭LiveCharts图形路径偏移
52 0
|
10月前
keil动态语法检测开关,去除红×
keil动态语法检测开关,去除红×
117 0
|
计算机视觉 Python
训练集制作:以指定帧间隔截取视频为图片,并保存指定路径及名称
训练集制作:以指定帧间隔截取视频为图片,并保存指定路径及名称
训练集制作:以指定帧间隔截取视频为图片,并保存指定路径及名称
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
|
前端开发 算法 JavaScript
《JS原理、方法与实践》- canvas作图(二)- 组合、剪切、坐标检测
《JS原理、方法与实践》- canvas作图(二)- 组合、剪切、坐标检测
155 0
【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )(二)
【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )(二)
293 0
【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )(二)