摄像头获取图片旋转90度 全部花屏或者对角一半花屏解决

问题

由摄像头直接获取到的数据是逆时针旋转90度的,这是因为Android手机的摄像头是横着放的,因此获取数据是逆时针旋转了90度。那么如果想获取到正的图像需要顺时针旋转90度。摄像头获取到YUV数据该怎样顺时针旋转90度?做旋转的时候碰到花屏或者对角花屏一半又是什么原因造成的?

解决问题

  1. 手机摄像头获取YUV数据,该怎样顺时针旋转90度?
    手机摄像头获取到的YUV数据是NV21。可以简化成一个 长宽4*6的小图片,总像素是6*4*3/2=36
    Y1 Y2 Y3 Y4  Y5  Y6
    Y7 Y8 Y9  Y10 Y11  Y12
    Y13 Y14 Y15  Y16 Y17  Y18
    Y19 Y20 Y21  Y22 Y23  Y24
    V1 U1 V2 U2 V3 U3
    V4  U4 V5  U5 V6  U6
    顺时针旋转90度之后,YUV数据就变成:

    Y19  Y13  Y7  Y1
    Y20  Y14  Y7  Y2
    Y21 Y 15 Y7   Y3
    Y22 Y16  Y10  Y4
    Y23  Y17 Y11  Y5
    Y24  Y18   Y12 Y6
    V4  U4 V1 U1
    V5  U5  V2  U2
    V6  U6   V3   U3
    长宽由原来的46变成64.
    NV21数据旋转90度代码如下:`

//旋转后的数据储存在buffer数组中,并且长宽的数值变成宽长
private void portraitData2Raw(byte[] data) {
int width = size.width;
int height =size.height;

    int y_len = width * height;
    int uvHeight = height/2;

    int k = 0;

    for (int j = 0; j < width; j++) {
        for (int i = height - 1; i >= 0; i--) {
            buffer[k++] = data[width * i + j];
        }
    }


    for (int j = 0; j < width; j+=2) {
        for (int i = uvHeight - 1; i >= 0; i--) {
            buffer[k++] = data[y_len + width * i + j];
            buffer[k++] = data[y_len + width * i + j + 1];
        }
    }

}

  1. 根据获取到的旋转之后的数据以JPEG的方式保存位相片
     如果宽长没有互调,那么就会出现花屏

3.如果在摄像头回调获取数据的时候,直接使用回调的数据会产生对角花屏。因为回调会修改这个数据,旋转也在修改这个数据。

猜你喜欢

转载自blog.csdn.net/weixin_43911199/article/details/126923408
今日推荐