代码之家  ›  专栏  ›  技术社区  ›  aniait

如何旋转YUv420数据?

  •  1
  • aniait  · 技术社区  · 16 年前

    I need to know how to rotate an image, which is in yuv420p format by 90 degrees. The option of converting this to rgb, rotating and again reconverting to yuv is not feasible. Even an algorithm would help.

    当做, Anirudh。

    3 回复  |  直到 14 年前
        1
  •  1
  •   jdehaan    16 年前

    我想不是吧 planar YUV 如果已经是了,那就很容易了(跳过第一步和最后一步)。你本来打算用4:2:0的平面图,但我不明白你为什么会有困难。

    1. 首先将其转换为平面:为平面分配空间,并根据 packed YUV 你有的格式。
    2. 旋转 Y U V U

        2
  •  1
  •   Bharat Kumar Molleti    14 年前

    平面表示Y截面首先是U截面,然后是V截面。

    考虑到图像宽度w和图像高度h。

    1. 图像的总大小为w*h*3/2

    2. Y截面也称为发光占据W*H。

    3. 在Y部分,每2x2块有一个U像素和V像素。

    4. 接下来是u部分,占据(w/2)*(h/2),并从图像开始处偏移w*h放置。

    5. V形截面如下,占据(w/2)*(h/2),并以(w*h)+(w*h)/4的偏移量铺设。

    为了将图像旋转90度,您实际上需要将这个w*h数组复制到h*w数组中。

    如上所述,您只需分别复制上述3个Y、U、V块。

    1. 从Y部分开始。要复制的第一个像素在源数组的(h-1)*w处,请将其复制到目标数组的(0,0)。第二个像素是(H-2)*W等…

    2. 请记住,U和V部分仅为(w/2)*(h/2)

    3. 接下来复制U部分。要复制的第一个像素是源数组中的(w*h)+(((h/2)-1)*(w/2)),将其复制到目标数组中的(h*w)+(0,0)。第二个像素是(w*h)+((h/2)-2)*(w/2))等…

    4. 最后复制v部分。要复制的第一个像素是源数组中的((w*h)+(w*h/4))+((h/2)-1)*(w/2)),将其复制到目标数组中的(h*w)+(w*h/4)+(0,0)。第二个像素是((w*h)+(w*h/4))+((h/2)-2)*(w/2))等等…

    以这种方式获得的目标数组包含90度旋转的图像。

        3
  •  0
  •   quantumSoup    16 年前

    我认为yuv420p确实是平面的。

    试着看一下Avisynth的源代码。turn(rotate)函数依次为.cpp和turnfunc.cpp。

    http://www.avisynth.org/