2015-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;
}
时间: 2024-10-22 03:51:41

2015-08-15: 从YUV420P中提取指定大小区域的相关文章

Delphi中建立指定大小字体和读取该字体点阵信息的函数(转)

源:Delphi中建立指定大小字体和读取该字体点阵信息的函数 Delphi中建立指定大小字体和读取该字体点阵信息的函数 作者:Thermometer Email:  [email protected] 由于要控制硬件,需要把矢量的汉字转化为点阵信息写入eprom或在液晶屏上显示,因此用Delphi写了如下的函数,可以把指定的一个汉字(两个字符)转化为点阵信息保存到文件,每个点对应一个二进制位,有文字信息该位为1,否则为0. 目前该函数可以生成指定大小的汉字并可读取点阵字模信息保存到文件. 如Co

截取UIImage指定大小区域

截取UIImage指定大小区域 最近遇到这样的需求:从服务器获取到一张照片,只需要显示他的左半部分,或者中间部分等等.也就是截取UIImage指定大小区域. UIImage扩展 我的解决方案是对UIImage进行扩展.通过CGImageRef和CGImage完成截取,调用的方法是:CGImageCreateWithImageInRect.扩展类叫UIImage+Crop,具体代码如下: UIImage+Crop.h #import <UIKit/UIKit.h> typedef NS_ENUM

iOS开发&gt;学无止境 - 截取UIImage指定大小区域

最近遇到这样的需求:从服务器获取到一张照片,只需要显示他的左半部分,或者中间部分等等.也就是截取UIImage指定大小区域. UIImage扩展 我的解决方案是对UIImage进行扩展.通过CGImageRef和CGImage完成截取,调用的方法是:CGImageCreateWithImageInRect.扩展类叫UIImage+Crop,具体代码如下: UIImage+Crop.h #import <UIKit/UIKit.h> typedef NS_ENUM(NSInteger, XYCr

【2015/08/06】sqlserver中怎样批量改动一个表的数据

这几天的练习.碰到一点小问题.比方我在成绩表里面有成绩初始化所有为0.那么如今我想随机生成100以内的数据写进去,应该如何操作呢?用到几个小函数即可了. 一个是rand() 它负责生成随机数. 一个是cast() 它负责类型转换. 一个是round() 它负责的是四舍五入取值.除此,floor()代表向下取值.而ceiling()代表向上取值. 接下来呢,就是对表score的操作.首先要生成一个暂时表#temp. select identity(int,1,1) id, * into temp

python 提取字符串中的指定字符 正则表达式

例1: 字符串: '湖南省长沙市岳麓区麓山南路麓山门' 提取:湖南,长沙 在不用正则表达式的情况下: address = '湖南省长沙市岳麓区麓山南路麓山门' address1 = address.split('省') # 用“省”字划分字符串,返回一个列表 address2 = address1[1].split('市') # 用“市”字划分address1列表的第二个元素,返回一个列表 print(address1) # 输出 ['湖南', '长沙市岳麓区麓山南路麓山门'] print(ad

c++之从标准流中提取文本数据

istream & istream :: get ( char * ,  int ,  char = '\n' ) ; istream & istream :: getline ( char * ,  int ,  char = '\n' ) ; 作用:从文本中提取指定个数的字符,并在串数组末添加一个空字符 其中,第一个参数指向接受字符数据的字符数组 第二个参数指定字符数组最多可容纳的字符个数 第三个参数用于指定一个终止符,缺省为换行符 操作遇到终止符或提取到规定个数字符时,提取终止 区别

10-1. 在字符串中查找指定字符(15)

输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c.如果找不到则输出“Not found”:若找到则输出字符串S中从c开始的所有字符. 输入格式: 输入在第1行中给出一个不超过80个字符长度的.以回车结束的非空字符串:在第2行中给出一个字符. 输出格式: 在一行中按照题目要求输出结果. 输入样例1: It is a black box b 输出样例1: black box 输入样例2: It is a black box B 输出样例2: Not found 1 #include <

dedecms中提取的zip压缩文件操作类zip.class.php

从织梦DeDeCMS中提取的zip压缩文件操作类,包含zip文件压缩.解压缩.添加文件到压缩包中等多个实用的函数,注释详细方便使用. 下载:dedecms中提取的zip压缩文件操作类zip.class.php 包含的函数和简单的使用方法: 1.函数get_List($zip_name) ,函数作用:获取zip文件中的文件列表.函数参数 $zip_name  zip文件名.返回值 文件列表数组. 2.函数Add($files,$compact),函数作用:增加文件到压缩文件.函数参数 $files

Storm(2015.08.12笔记)

2015.08.12Storm ? 一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架. ? Storm能实现高频数据和大规模数据的实时处理. 官网资料显示storm的一个节点在1秒钟能够处理100万个100字节的消息([email protected]的CPU,24GB的内存) (storm +kafka+flume) ? ? 二.HADOOP与STORM比较 数据来源:HADOOP处理的是HDFS上TB级别的数据(历史数据),STORM是处理的是实时