第一个坑:
我们设置完预览画面旋转90°后,如果要保存图片或者进行直播推流,还需要把摄像头数据手动旋转90°再进行保存,否则我们看到的画面也是横着的
第二个坑:
在进行手动旋转摄像头数据的时候,我们不能在原数组中进行旋转,那样会出现下三角区域为乱码的情况
IMG_0.jpg
private void portraitData2Raw_erro(byte[] data) {
int width = size.width;
int height = size.height;
// 旋转y
int y_len = width * height;
//u y/4 v y/4
int uvHeight = height/2;
int k = 0;
for (int j = 0; j < width; j++) {
for (int i = height - 1; i >= 0; i--) {
// 存值 k++ 0 取值 width * i + j
buffer[k++] = data[width * i + j];
}
}
// 旋转uv
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];
}
}
}
需要把原数组的像素旋转输出到另一个数组中,这样保存的图片才是正确的
IMG_1.jpg
public static void portraitData2Raw(byte[] data,byte[] output,int width,int height) {
int y_len = width * height;
int uvHeight = height >> 1; // uv数据高为y数据高的一半
int k = 0;
for (int j = 0; j < width; j++) {
for (int i = height - 1; i >= 0; i--) {
output[k++] = data[width * i + j];
}
}
for (int j = 0; j < width; j += 2) {
for (int i = uvHeight - 1; i >= 0; i--) {
output[k++] = data[y_len + width * i + j];
output[k++] = data[y_len + width * i + j + 1];
}
}
}