非整数倍率YUV422图像的自由缩放算法
来源:互联网 发布:xbox360手柄链接mac 编辑:程序博客网 时间:2024/05/16 11:00
下面的代码,实现将一幅YUV422的双通道图片(640x480大小),取中间区域(560x400大小)使用插值的办法放大至(640x480)。这个算法可以用来实现将图片外围区域截掉。
#define X_RATIO (8)
#define Y_RATIO (6)
PUBLIC void YUVScale(JINF_YUV_CHN_T *const yuv_ptr,const uint32 Width,const uint32 Height)
{
uint8 *const src_y_ptr = (uint16 *)yuv_ptr->y_chn_ptr;
uint8 *const src_uv_ptr = (uint16 *)yuv_ptr->u_chn_ptr;
uint32 x,y,w,h=0,xl,yl,dx,dy;
if ((Width%(X_RATIO<<1)!=0)||(Height%(Y_RATIO<<1)!=0))
{
TRACE("%s Width=%d,Height=%d",__func__,Width,Height);
return;
}
ASSERT(PNULL != yuv_ptr);
xl=(Width-(Width/X_RATIO))>>1;
yl=(Height-(Height/Y_RATIO))>>1;
dx=Width / (X_RATIO<<1);
dy=Height / (Y_RATIO<<1);
for (y=0; y<yl; y++,h++)
{
w = 0;
for (x=0; x<xl; x+=2,w+=2)
{
CopyPixel:
//2 Quadrant 2
src_y_ptr[h*Width+w] = src_y_ptr[(dy+y)*Width+dx+x];
src_y_ptr[h*Width+w+1] = src_y_ptr[(dy+y)*Width+dx+x+1];
src_uv_ptr[h*Width+w] = src_uv_ptr[(dy+y)*Width+dx+x];
src_uv_ptr[h*Width+w+1] = src_uv_ptr[(dy+y)*Width+dx+x+1];
//2 Quadrant 1
src_y_ptr[h*Width+(Width-w-1)] = src_y_ptr[(dy+y)*Width+(Width-dx-x-1)];
src_y_ptr[h*Width+(Width-w-2)] = src_y_ptr[(dy+y)*Width+(Width-dx-x-2)];
src_uv_ptr[h*Width+(Width-w-1)] = src_uv_ptr[(dy+y)*Width+(Width-dx-x-1)];
src_uv_ptr[h*Width+(Width-w-2)] = src_uv_ptr[(dy+y)*Width+(Width-dx-x-2)];
//2 Quadrant 4
src_y_ptr[(Height-h-1)*Width+(Width-w-1)] = src_y_ptr[(Height-dy-y-1)*Width+(Width-dx-x-1)];
src_y_ptr[(Height-h-1)*Width+(Width-w-2)] = src_y_ptr[(Height-dy-y-1)*Width+(Width-dx-x-2)];
src_uv_ptr[(Height-h-1)*Width+(Width-w-1)] = src_uv_ptr[(Height-dy-y-1)*Width+(Width-dx-x-1)];
src_uv_ptr[(Height-h-1)*Width+(Width-w-2)] = src_uv_ptr[(Height-dy-y-1)*Width+(Width-dx-x-2)];
//2 Quadrant 3
src_y_ptr[(Height-h-1)*Width+w] = src_y_ptr[(Height-dy-y-1)*Width+dx+x];
src_y_ptr[(Height-h-1)*Width+w+1] = src_y_ptr[(Height-dy-y-1)*Width+dx+x+1];
src_uv_ptr[(Height-h-1)*Width+w] = src_uv_ptr[(Height-dy-y-1)*Width+dx+x];
src_uv_ptr[(Height-h-1)*Width+w+1] = src_uv_ptr[(Height-dy-y-1)*Width+dx+x+1];
if (
((w+2) % (X_RATIO<<1))==
((X_RATIO<<1)-2)
)
{
w+=2;
goto CopyPixel;
}
}
if (((h+1) % (Y_RATIO))==(Y_RATIO-1))
{
h++;
memcpy(src_y_ptr+h*Width,src_y_ptr+(h-1)*Width,Width);
memcpy(src_uv_ptr+h*Width,src_uv_ptr+(h-1)*Width,Width);
memcpy(src_y_ptr+(Height-h-1)*Width,src_y_ptr+(Height-h)*Width,Width);
memcpy(src_uv_ptr+(Height-h-1)*Width,src_uv_ptr+(Height-h)*Width,Width);
}
}
}
#define X_RATIO (8)
#define Y_RATIO (6)
PUBLIC void YUVScale(JINF_YUV_CHN_T *const yuv_ptr,const uint32 Width,const uint32 Height)
{
uint8 *const src_y_ptr = (uint16 *)yuv_ptr->y_chn_ptr;
uint8 *const src_uv_ptr = (uint16 *)yuv_ptr->u_chn_ptr;
uint32 x,y,w,h=0,xl,yl,dx,dy;
if ((Width%(X_RATIO<<1)!=0)||(Height%(Y_RATIO<<1)!=0))
{
TRACE("%s Width=%d,Height=%d",__func__,Width,Height);
return;
}
ASSERT(PNULL != yuv_ptr);
xl=(Width-(Width/X_RATIO))>>1;
yl=(Height-(Height/Y_RATIO))>>1;
dx=Width / (X_RATIO<<1);
dy=Height / (Y_RATIO<<1);
for (y=0; y<yl; y++,h++)
{
w = 0;
for (x=0; x<xl; x+=2,w+=2)
{
CopyPixel:
//2 Quadrant 2
src_y_ptr[h*Width+w] = src_y_ptr[(dy+y)*Width+dx+x];
src_y_ptr[h*Width+w+1] = src_y_ptr[(dy+y)*Width+dx+x+1];
src_uv_ptr[h*Width+w] = src_uv_ptr[(dy+y)*Width+dx+x];
src_uv_ptr[h*Width+w+1] = src_uv_ptr[(dy+y)*Width+dx+x+1];
//2 Quadrant 1
src_y_ptr[h*Width+(Width-w-1)] = src_y_ptr[(dy+y)*Width+(Width-dx-x-1)];
src_y_ptr[h*Width+(Width-w-2)] = src_y_ptr[(dy+y)*Width+(Width-dx-x-2)];
src_uv_ptr[h*Width+(Width-w-1)] = src_uv_ptr[(dy+y)*Width+(Width-dx-x-1)];
src_uv_ptr[h*Width+(Width-w-2)] = src_uv_ptr[(dy+y)*Width+(Width-dx-x-2)];
//2 Quadrant 4
src_y_ptr[(Height-h-1)*Width+(Width-w-1)] = src_y_ptr[(Height-dy-y-1)*Width+(Width-dx-x-1)];
src_y_ptr[(Height-h-1)*Width+(Width-w-2)] = src_y_ptr[(Height-dy-y-1)*Width+(Width-dx-x-2)];
src_uv_ptr[(Height-h-1)*Width+(Width-w-1)] = src_uv_ptr[(Height-dy-y-1)*Width+(Width-dx-x-1)];
src_uv_ptr[(Height-h-1)*Width+(Width-w-2)] = src_uv_ptr[(Height-dy-y-1)*Width+(Width-dx-x-2)];
//2 Quadrant 3
src_y_ptr[(Height-h-1)*Width+w] = src_y_ptr[(Height-dy-y-1)*Width+dx+x];
src_y_ptr[(Height-h-1)*Width+w+1] = src_y_ptr[(Height-dy-y-1)*Width+dx+x+1];
src_uv_ptr[(Height-h-1)*Width+w] = src_uv_ptr[(Height-dy-y-1)*Width+dx+x];
src_uv_ptr[(Height-h-1)*Width+w+1] = src_uv_ptr[(Height-dy-y-1)*Width+dx+x+1];
if (
((w+2) % (X_RATIO<<1))==
((X_RATIO<<1)-2)
)
{
w+=2;
goto CopyPixel;
}
}
if (((h+1) % (Y_RATIO))==(Y_RATIO-1))
{
h++;
memcpy(src_y_ptr+h*Width,src_y_ptr+(h-1)*Width,Width);
memcpy(src_uv_ptr+h*Width,src_uv_ptr+(h-1)*Width,Width);
memcpy(src_y_ptr+(Height-h-1)*Width,src_y_ptr+(Height-h)*Width,Width);
memcpy(src_uv_ptr+(Height-h-1)*Width,src_uv_ptr+(Height-h)*Width,Width);
}
}
}
- 非整数倍率YUV422图像的自由缩放算法
- 基于YUV422的图像缩放 (双线性插值)
- 基于平面格式YUV422的图像缩放
- 图像自由缩放—双线性插值
- 几种简单的图像缩放算法
- 5 .图像的缩放,线性插值算法
- 几个图像缩放算法的比较
- 最近邻算法的图像缩放代码
- 几个图像缩放算法的比较
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- 图像缩放算法
- ImageView的Scaletype
- XMPP协议的原理介绍
- 解决QT程序CPU占用率高(setStyleSheet)
- sql删除表内所有数据 修改自动增长列起始值
- 深航遭虚假恐怖信息威胁案疑犯可能获刑超5年-民航局-虚假-信息
- 非整数倍率YUV422图像的自由缩放算法
- linux系统各个文件夹的介绍(未完善)
- MFC 生成 exe文件的图标更改方法(转)
- 对inout端口的理解
- Ponsole让C#控制台程序更漂亮的类库
- java序列化
- Android下通过root实现对system_server中binder的ioctl调用拦截
- 爱了就不后悔
- 如果有一天我不再烦你,你会想我吗?