这周做的一个android的camera开发,需要获取到视频帧数据,并且需要是nv21格式的byte数组,并且视频帧的图像需要是正方向的。和android相机打过交道的都清楚,android的camera获取到的图片都是横向的,因此,需要进行旋转,对于图像的旋转,其实bitmap这个类已经可以帮我们实现了,但是前提是你需要将你的数据格式转换为Bitmap才行,但是我们如果通过setPreviewCallback来获取视频帧,获取到的图片都是nv21,如果装换为bitmap后,又很难的转换为nv21格式的数据。因此则需要面临一个问题,如歌旋转nv21格式的byte数组,首先先来讲下nv21格式,讲到nv21就也要说说yuv240和nv12:

NV12、NV21(属于YUV420)

aaarticlea/png;base64,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" alt="" />

NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00

YUV420 planar数据存储, 以720×488大小图象YUV420 planar为例,

其存储格式是: 共大小为(720×480×3>>1)字节,

分为三个部分: Y分量:       (720×480)个字节   U(Cb)分量:  (720×480>>2)个字节     V(Cr)分量:   (720×480>>2)个字节

三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。

即YUV数据的0--720×480字节是Y分量值,    720×480--720×480×5/4字节是U分量    720×480×5/4 --720×480×3/2字节是V分量。

4 :2: 2 和4:2:0 转换:

最简单的方式:

YUV4:2:2 ---> YUV4:2:0  Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。 YUV4:2:0 ---> YUV4:2:2  Y不变,将U和V信号值的每一行分别拷贝一份形成连续两行数据。

在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V。对于所有 YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完 全不同的。420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。而420sp它是UV、UV这样交替存放的。(见下图) 有了上面的理论,我就可以准确的计算出一个YUV420在内存中存放的大小。 width * hight =Y(总和) U = Y / 4   V = Y / 4

所以YUV420 数据在内存中的长度是 width * hight * 3 / 2,

假设一个分辨率为8X4的YUV图像,它们的格式如下图:

图:YUV420sp格式

图:YUV420p数据格式如下图

具体的旋转代码如下:

public static byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
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++;
}
}
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;
} private static byte[] rotateYUV420Degree180(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
int i = 0;
int count = 0;
for (i = imageWidth * imageHeight - 1; i >= 0; i--) {
yuv[count] = data[i];
count++;
}
i = imageWidth * imageHeight * 3 / 2 - 1;
for (i = imageWidth * imageHeight * 3 / 2 - 1; i >= imageWidth
* imageHeight; i -= 2) {
yuv[count++] = data[i - 1];
yuv[count++] = data[i];
}
return yuv;
} public static byte[] rotateYUV420Degree270(byte[] data, int imageWidth,
int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
int nWidth = 0, nHeight = 0;
int wh = 0;
int uvHeight = 0;
if (imageWidth != nWidth || imageHeight != nHeight) {
nWidth = imageWidth;
nHeight = imageHeight;
wh = imageWidth * imageHeight;
uvHeight = imageHeight >> 1;// uvHeight = height / 2
} int k = 0;
for (int i = 0; i < imageWidth; i++) {
int nPos = 0;
for (int j = 0; j < imageHeight; j++) {
yuv[k] = data[nPos + i];
k++;
nPos += imageWidth;
}
}
for (int i = 0; i < imageWidth; i += 2) {
int nPos = wh;
for (int j = 0; j < uvHeight; j++) {
yuv[k] = data[nPos + i];
yuv[k + 1] = data[nPos + i + 1];
k += 2;
nPos += imageWidth;
}
}
return rotateYuv420Degree180(rotateYuv420Degree90(data, imageWidth, imageHeight), imageWidth, imageHeight);
}

然后,如果你想要查看旋转后的图像,则通过以下代码即可:

YuvImage yuvimage = new YuvImage(
data,
ImageFormat.NV21,
width,
height,
null);
baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, width, height), 100, baos);// 80--JPG图片的质量[0-100],100最高
rawImage = baos.toByteArray();
//将rawImage转换成bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);

在这里边我们需要注意的是我们的宽和高,需要用转移后的,不可使用转移前的,否则会出现看到的图片有重影的现象。  

  

最新文章

  1. CGAffineTransform
  2. 【转】Oracle索引失效问题
  3. 正则表达式基础---转自 Python正则表达式指南 前边
  4. ASP函数大全
  5. WINDOWS黑客基础(6):查看文件里面的导入表
  6. Codeforces Round #340 (Div. 2) B. Chocolate 水题
  7. Cgroup - Linux 内存资源管理
  8. Mysql的执行顺序
  9. 新注册第一帖----------------------乱码新手自学.net 之Linq 入门篇
  10. 封装TableView有可能用到的数据结构和UITableViewCell的一个继承类
  11. 学习mysql语法--基础篇(一)
  12. js实现每次程序发送一个数据 ,多次发送不一样,5秒后继续执行多次程序,判断如果五秒后发送过来的数据和上次不一样,少的删除多的增加
  13. Redis未授权访问
  14. c#实现用SQL池(多线程),定时批量执行SQL语句 【转】
  15. unzip解压失败
  16. Charles 注册码/破解/激活
  17. iOS weak 内存释放问题
  18. Go并发编程实战 (郝林 著)
  19. android-基础编程-ScrollView
  20. Android控件第6类——杂项控件

热门文章

  1. 【云计算】使用nsenter进入Docker容器进行调试
  2. appium运行报错
  3. Node.js mm131图片批量下载爬虫1.01 增加断点续传功能
  4. Python strings, 元组tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的
  5. win7 ARP 命令运行失败解决办法
  6. 【leetcode】Reorder List (python)
  7. hibernate 联合主键
  8. 【微信小程序】获取轮播图当前图片下标、滑动展示对应的位数、点击位数展示对应图片
  9. iTunes 无法添加 iPhone 自定义铃声
  10. python安装scrapy小问题总结