• 2016-08-15:从YUV420P中提取指定大小区域


    typedef struct
    {
        int width;
        int height;
    }SizeInfo;
    
    typedef struct 
    {
        int x;
        int y;
        int width;
        int height;
    }ImageRect;
    
    /*************************************************
    // Method     : ExtraceSpecifiedSizeYuv
    // Author     : zhoulee
    // Date       : 2016/08/15 16:14
    // Description: 从YUV420P中获取指定大小的YUV420P图像
    // Returns    : bool: true 获取成功; false 获取失败
    // Parameter  : 
    //              image: 原始YUV420P数据指针
    //              imgSize: 原始图像尺寸, 图像宽高必须为偶数
    //              rect: 指定的区域信息, 区域左上角坐标以及宽高必须为偶数
    //              partionImg: 指定区域的YUV420P数据 
    *************************************************/
    bool ExtraceSpecifiedSizeYuv(const unsigned char* image, const SizeInfo& imgSize,
                                 const ImageRect& rect, unsigned char* partionImg);
    
    bool ExtraceSpecifiedSizeYuv(const unsigned char* image, const SizeInfo& imgSize,
                                 const ImageRect& rect, unsigned char* partionImg)
    {
        if(imgSize.width%2 != 0 || imgSize.height%2 != 0
            || rect.x%2 != 0 || rect.y%2 != 0
            || rect.width%2 != 0 || rect.height%2 != 0
            || rect.x + rect.width > imgSize.width
            || rect.y + rect.height > imgSize.height)
        {
            return false;
        }
    
        int yBegPos = 0;
        int uBegPos = imgSize.width * imgSize.height;
        int vBegPos = uBegPos + (imgSize.width * imgSize.height) / 4;
    
        int offset = 0;
        //y component
        for(int row = rect.y; row < rect.y + rect.height; ++row)
        {
            int yOffset = yBegPos + row * imgSize.width + rect.x;
            memcpy(partionImg + offset, image + yOffset, rect.width);
            offset += rect.width;
        }
    
        //u component
        for (int row = rect.y; row < rect.y + rect.height; row+=2)
        {
            //for (int col = rect.x; col < rect.x + rect.width; col+=2)
            //{
            //    int uOffset = row * imgSize.width / 4 + col / 2;
            //    partionImg[offset] = image[uBegPos + uOffset];
            //    ++offset;
            //}
            int uOffset = uBegPos + row * imgSize.width / 4 + rect.x / 2;
            memcpy(partionImg + offset, image + uOffset, rect.width / 2);
            offset += rect.width / 2;
        }
    
        //v component
        for (int row = rect.y; row < rect.y + rect.height; row+=2)
        {
            //for (int col = rect.x; col < rect.x + rect.width; col+=2)
            //{
            //    int vOffset = row * imgSize.width / 4 + col / 2;
            //    partionImg[offset] = image[vBegPos + vOffset];
            //    ++offset;
            //}
            int vOffset = vBegPos + row * imgSize.width / 4 + rect.x / 2;
            memcpy(partionImg + offset, image + vOffset, rect.width / 2);
            offset += rect.width / 2;
        }
    
        return true;
    }
  • 相关阅读:
    【凡尘】---react-redux---【react】
    React生命周期详解
    写文章很难,ai自动生成文章为你来排忧
    怎么用ai智能写作【智媒ai伪原创】快速写文章?
    给大家介绍个Seo伪原创工具吧,可以免费用的哈
    自媒体文章难写,在线伪原创文章生成就简单了
    内容创作难吗 不妨试试智媒ai伪原创
    Ai伪原创工具,轻松几秒出爆文
    什么AI写作软件靠谱,好用?
    分享个免费伪原创工具 关键词自动生成文章
  • 原文地址:https://www.cnblogs.com/zhouLee/p/5773534.html
Copyright © 2020-2023  润新知