这周做的一个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);

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

  

android camera之nv21旋转的更多相关文章

  1. 【Android】Android Camera原始帧格式转换 —— 获取Camera图像(一)

     概述: 做过Android Camera图像采集和处理的朋友们应该都知道,Android手机相机采集的原始帧(RawFrame)默认是横屏格式的,而官方API有没有提供一个设置Camera采集图像的 ...

  2. Android 7.1 屏幕旋转流程分析

    Android 7.1   屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...

  3. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  4. Android -- Camera源码简析,启动流程

    com.android.camera.Camera.java,主要的实现Activity,继承于ActivityBase. ActivityBase 在ActivityBase中执行流程: onCre ...

  5. Android Camera开发经验总结以及踩过的那些坑

    写在开头 需求方:上传试卷的时候,用户自己拍的照片有很多问题.如:不清晰.图片歪了.错误图片等.我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理- ...

  6. Android Camera子系统之源码View

    本文基于Android 4.2.2+Linux3.6.9+SAMA5D3 SoC从源码的角度审视Android Camera子系统. 应用层 Androd原生Camera应用 /system/app/ ...

  7. android camera setMeteringArea详解

    摘要: 本文为作者原创,未经允许不得转载:原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/5802814.html setMeteringArea() ...

  8. Android — Camera聚焦流程

    原文  http://www.cnphp6.com/archives/65098 主题 Android Camera.java autoFocus()聚焦回调函数 @Override public v ...

  9. android camera setParameters failed 类问题分析总结

    在 monkey test 测试中出现了一例 RuntimeException ,即 setParameters failed. LOG显示为:09-01 18:47:17.348 15656 156 ...

随机推荐

  1. C#/Sqlite-单机Window 程序 sqlite 数据库实现

    数据库分析和选择 Excel 文件 做数据源 限制性比较强,且不适合查询,分析 等操作 Access 数据库 Access 管理数据界面和功能不强 mysql 和sql server 功能满足,但需要 ...

  2. Visual Studio2015 简体中文版 安装

    VS2015简体中文版安装 导航 介绍 解决安装先决条件 安装 VS2015 创建桌面快捷方式 启动 VS2015 命令启动VS2015 配置 VS2015 启动完成 Visual Studio的功能 ...

  3. 解决安装完Ubuntu系统后启动项中没有Ubuntu的问题

    问题出现的原因是你没有把grub安装到硬盘的起始扇区里,按理说Ubuntu在安装的时候应该能很好的处理这个问题,但有个别电脑还是会出问题.不过我们可以通用命令解决 问题. 使用U盘进入Ubuntu系统 ...

  4. init: cannot execve(‘XXX’):Permission denied问题

    近期在给android 4.3系统进行root时候,一直出现例如以下的红色权限问题  :  7.695741] Freeing init memory: 236K [    8.555286] ini ...

  5. DDCX2018届校招内推笔试——算法工程师

    -------------------------------------------------------------------------[选择题]---------------------- ...

  6. js检测回车符

    在说检测回车符之前,需要了解keydown和keypress的区别 比如你可以将检测事件绑定在input上,如下所示: <input name="remark" id=&qu ...

  7. sql自动增长标识(转载)

    sql自动增长标识   对于一个设了自动增长标识的数据表来说,它的字段的值是由数据库自动设置的:这在导数据时很麻烦.   当我们导数据时,我们往往想想将标识字段的数据也导进来,怎么办呢?   方法有两 ...

  8. 如何启动mininet实例上的wireshark图形界面

    启动wireshark 要启动mininet实例上的wireshark的图形界面,其实关键点只有两个: 保证宿主机上安装了X11 使用ssh -Y mininet@192.168.56.102 登录进 ...

  9. Zynq GPIO 中断

    /* * Copyright (c) 2009-2012 Xilinx, Inc. All rights reserved. * * Xilinx, Inc. * XILINX IS PROVIDIN ...

  10. vivado编译出错 [Synth 8-729] [Synth 8-787]

    http://www.cnblogs.com/pejoicen   打开vivado工程后,发现右上角如下图所示: 重新编译这两个ip核后,对整个工程synthesis,工程报错 [Synth 8-7 ...