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;
}