我需要知道如何将 yuv420p 格式的图像旋转 90 度。将其转换为 rgb、旋转并再次转换为 yuv 的选项是不可行的。即使是算法也会有所帮助。
问候,阿尼鲁德。
我需要知道如何将 yuv420p 格式的图像旋转 90 度。将其转换为 rgb、旋转并再次转换为 yuv 的选项是不可行的。即使是算法也会有所帮助。
问候,阿尼鲁德。
如果图像是 yuv420 平面图像,这就是图像数据的编码方式。平面意味着首先是 y 截面,然后是 U 截面,然后是 V 截面。
考虑图像的宽度 w 和图像的高度 h。
图像总大小为 w*h*3/2
Y 截面也称为发光,占 w*h。
Y 部分的每个 2x2 块都有一个 U 像素和一个 V 像素。
接下来是 U 部分,占据 (w/2)*(h/2) 并放置在距图像开头的偏移 w*h 处。
V 部分紧随其后,占据 (w/2)*(h/2) 并放置在 (w*h)+((w*h)/4) 的偏移处。
为了将图像旋转 90 度,您实际上是将这个 w*h 数组复制到一个 h*w 数组中
如上篇文章所述,您只需分别复制上述 3 个 Y、U、V 块中的每一个。
从 Y 部分开始。要复制的第一个像素位于源数组中的 (h-1)*w 处,将其复制到目标数组的 (0,0)。第二个像素在 (h-2)*w 等等......
请记住,U 和 V 部分只有 (w/2)*(h/2)
接下来复制U部分。要复制的第一个像素位于 Source Array 中的 (w*h)+(((h/2)-1)*(w/2)) 处,将其复制到 (h*w)+(0,0) 中目标数组。第二个像素位于 (w*h)+(((h/2)-2)*(w/2)) 等...
最后复制V部分。要复制的第一个像素位于 Source Array 中的 ((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)) 等...
这样得到的Destination Array包含90度旋转后的图像。