android - react-native-camera中YUV_420_888格式的算法旋转

标签 android image algorithm react-native math

下面是 react-native-camera 的旋转代码,用于支持 ZXING 库检测条码。具体链接是here

    private byte[] rotateImage(byte[] imageData, int width, int height) {
        byte[] rotated = new byte[imageData.length];
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                rotated[x * height + height - y - 1] = imageData[x + y * width];
            }
        }
        return rotated;
    }

imageData为YUV_420_888格式

我知道它是旋转一个框架,但它是如何工作的呢?是旋转90度还是180度?顺时针还是逆时针?

我很难用我完全不理解的示例图像来测试它。

最佳答案

您发布的代码将每像素 1 个字节的单色(灰度)图像顺时针旋转 90 度,并将其返回到一个新的字节数组中。它不处理任何色度信息。

YUV_420_888图像格式存储一张YUV格式的图像,其中Y是先存入内存的亮度(灰度分量),U和V是先存入内存的色度分量。为了节省空间,U 和 V 以亮度分量的水平和垂直分辨率的一半存储。

因为亮度分量先被存储,如果你只是忽略它之后的色度 channel ,你可以把它当作一个单色图像,这就是代码所做的。

为了进行实际的旋转,代码迭代了 y 和 x 中的所有像素。对于每个像素,它计算旋转图像中的新像素位置并将其复制到那里。

这是一张画得不好的图表:

enter image description here

YUV_420_888 一次一行地存储像素,从上到下,从左到右。所以计算像素位置的数学是这样的:

old_pixel_location = (y * width) + x

正如您在图像中看到的,旧图像宽度变为新图像高度,反之亦然。旋转图像中的像素位置有一个等于x值的new_y值,以及图像右侧左侧y个像素的new_x值。

new_width = height
new_height = width
new_x = (new_width - 1) - y
new_y = x

新的像素位置是:

new_pixel_location = (new_y * new_width) + new_x

// substituting gives:
new_x = (height - 1) - y
new_pixel_location = (x * height) + ((height - 1) - y)

// removing brackets and re-ordering:
old_pixel_location = x + y * width
new_pixel_location = x * height + height - y - 1

关于android - react-native-camera中YUV_420_888格式的算法旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57443599/

相关文章:

Android 自动与自定义数据同步

Android ListView 行填充/边距

Android 文字转语音

java - 确定一个球体是否被放置在它周围的其他球体完全包围

algorithm - 返回 0 到 4 之间的数字

algorithm - 元素混合算法

android - 如何确定低通滤波器的 ALPHA(平滑常数)

image - 数据如何存储在图像文件中

image - css 确定一个容器中的单个和多个图像

html - 添加了两个内联 block gif 图像,该行的背景颜色发生变化?