问题
由摄像头直接获取到的数据是逆时针旋转90度的,这是因为Android手机的摄像头是横着放的,因此获取数据是逆时针旋转了90度。那么如果想获取到正的图像需要顺时针旋转90度。摄像头获取到YUV数据该怎样顺时针旋转90度?做旋转的时候碰到花屏或者对角花屏一半又是什么原因造成的?
解决问题
- 手机摄像头获取YUV数据,该怎样顺时针旋转90度?
手机摄像头获取到的YUV数据是NV21。可以简化成一个 长宽4*6的小图片,总像素是6*4*3/2=36
顺时针旋转90度之后,YUV数据就变成:
长宽由原来的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];
}
}
}
- 根据获取到的旋转之后的数据以JPEG的方式保存位相片
如果宽长没有互调,那么就会出现花屏
3.如果在摄像头回调获取数据的时候,直接使用回调的数据会产生对角花屏。因为回调会修改这个数据,旋转也在修改这个数据。