也可以看看这个;
https://www.jianshu.com/p/a6ea929b587c
镜像:
https://blog.csdn.net/quantum7/article/details/79747796
//NV21: YYYY VUVU
byte[] NV21_mirror(byte[] nv21_data, int width, int height)
{
int i;
int left, right;
byte temp;
int startPos = 0;
// mirror Y
for (i = 0; i < height; i++)
{
left = startPos;
right = startPos + width - 1;
while (left < right)
{
temp = nv21_data[left];
nv21_data[left] = nv21_data[right];
nv21_data[right] = temp;
left ++;
right--;
}
startPos += width;
}
// mirror U and V
int offset = width * height;
startPos = 0;
for (i = 0; i < height / 2; i++)
{
left = offset + startPos;
right = offset + startPos + width - 2;
while (left < right)
{
temp = nv21_data[left ];
nv21_data[left ] = nv21_data[right];
nv21_data[right] = temp;
left ++;
right--;
temp = nv21_data[left ];
nv21_data[left ] = nv21_data[right];
nv21_data[right] = temp;
left ++;
right--;
}
startPos += width;
}
return nv21_data;
}
https://blog.csdn.net/emily2015/article/details/79592920
通过摄像头采集的yuv数据经过旋转处理后,再进行镜像处理。
旋转
public class YUV420spRotateUtils {
//后置旋转90度;
public static byte[] rotateYUVDegree90(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
// Rotate the Y luma
int i = 0;
for (int x = 0; x < imageWidth; x++) {
for (int y = imageHeight - 1; y >= 0; y--) {
yuv[i] = data[y * imageWidth + x];
i++;
}
}
// Rotate the U and V color components
i = imageWidth * imageHeight * 3 / 2 - 1;
for (int x = imageWidth - 1; x > 0; x = x - 2) {
for (int y = 0; y < imageHeight / 2; y++) {
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];
i--;
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];
i--;
}
}
return yuv;
}
//前置旋转270度;
public static byte[] rotateYUVDegree270(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
// Rotate the Y luma
int i = 0;
for (int x = imageWidth - 1; x >= 0; x--) {
for (int y = 0; y < imageHeight; y++) {
yuv[i] = data[y * imageWidth + x];
i++;
}
}// Rotate the U and V color components
i = imageWidth * imageHeight;
for (int x = imageWidth - 1; x > 0; x = x - 2) {
for (int y = 0; y < imageHeight / 2; y++) {
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];
i++;
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];
i++;
}
}
return yuv;
}
}
镜像
//镜像;
public byte[] frameMirror(byte[] data, int width, int height) {
byte tempData;
for (int i = 0; i < height * 3 / 2; i++) {
for (int j = 0; j < width / 2; j++) {
tempData = data[i * width + j];
data[i * width + j] = data[(i + 1) * width - 1 - j];
data[(i + 1) * width - 1 - j] = tempData;
}
}
return data;
}