《android中对camera数据的简单编码处理》

原文:http://m-ittrue.iteye.com/blog/758410

http://chenweihuacwh.iteye.com/blog/571223

  大多数图像处理软件在处理时是需要RGB格式的图像,而默认的视频流是压缩的YUV格式,Android下是YUV420SP,这个格式,虽然可以在程序中修改,但是修改后好像不起作用,也就是说只能得到编码为YUV420SP的视频流,这就需要把YUV420SP的视频流转换成RGB格式的图像,用于图像识别 
     从log中可以看到Parameters预设的参数: 
picture-format=jpeg 
picture-preview=yuv422sp 
    看来,真的行不通,那就只能获取帖数据了,其中的data是yuv格式的,需要对其解码。 
    这是我在开发android程序中用到的一个用于处理图片解码的方法,不是本人所写,特此共享。 

/**
*:YUV420SP解码的方式
*yuv420sp[]为原始的数据
*width为图片位图长,height为图片位图高
*rgbBuf[]是用于存贮原始数据经过解码后的r g b三元色数据
*/
static public void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp, int width, int height) {
              //定义单通道数据长度
	    final int frameSize = width * height;
             //如果传进来的rgbBuf 为空,则抛出空指针异常
	if (rgbBuf == null)
	    throw new NullPointerException("buffer 'rgbBuf' is null");      //如果传进来的rgbBuf 为比三通道数据长度小,则抛出异常,并打出相应信息
	if (rgbBuf.length < frameSize * 3)
	    throw new IllegalArgumentException("buffer 'rgbBuf' size "
	             + rgbBuf.length + " < minimum " + frameSize * 3);
	   //如果传进来的yuv420sp 为空,则抛出空指针异常
	if (yuv420sp == null)
	    throw new NullPointerException("buffer 'yuv420sp' is null");
	  //如果传进来的rgbBuf 为比三通道数据长度的一半小,则抛出异常,并打出相应信息
	if (yuv420sp.length < frameSize * 3 / 2)
	    throw new IllegalArgumentException("buffer 'yuv420sp' size " + yuv420sp.length
	             + " < minimum " + frameSize * 3 / 2);
	       //经过上面的叛断,我们正式进行解码了
	    int i = 0, y = 0;
	    int uvp = 0, u = 0, v = 0;
               //r g b 三元色初始化
	    int y1192 = 0, r = 0, g = 0, b = 0;
             //下面的两个for循环都只是为了把第一个像素点的的R G B读取出来,就是一行一行循环读取.
	    for (int j = 0, yp = 0; j < height; j++) {
	         uvp = frameSize + (j >> 1) * width;
	         u = 0;
	         v = 0;
	        for (i = 0; i < width; i++, yp++) {
	             y = (0xff & ((int) yuv420sp[yp])) - 16;
	            if (y < 0) y = 0;
	            if ((i & 1) == 0) {
	                 v = (0xff & yuv420sp[uvp++]) - 128;
	                 u = (0xff & yuv420sp[uvp++]) - 128;
	             }   

	             y1192 = 1192 * y;
	             r = (y1192 + 1634 * v);
	             g = (y1192 - 833 * v - 400 * u);
	             b = (y1192 + 2066 * u);
	               //始终持 r g b在0 - 262143
	            if (r < 0) r = 0; else if (r > 262143) r = 262143;
	            if (g < 0) g = 0; else if (g > 262143) g = 262143;
	            if (b < 0) b = 0; else if (b > 262143) b = 262143;
	               //安位运算,分别将一个像素点中的r g b 存贮在rgbBuf中
	             rgbBuf[yp * 3] = (byte)(r >> 10);
	             rgbBuf[yp * 3 + 1] = (byte)(g >> 10);
	             rgbBuf[yp * 3 + 2] = (byte)(b >> 10);
	         }
	     }
	   }  

通过这样的解码,我们就可以得到我们想要的rgbBuf[],相应的还原机制也就是返过来而已。
时间: 2024-12-29 01:46:17

《android中对camera数据的简单编码处理》的相关文章

《I&#039;m a Mac:雄狮训练手册》——2.4 快速用户切换

2.4 快速用户切换 I'm a Mac:雄狮训练手册 传统的用户切换需要登出系统重新登录,这样一方面耗时较长,另一方面一次只能登录一个用户,再者会关闭原用户已打开的程序和窗口. 而快速切换则用于不登出系统就切换到另外一个用户,使得多账户同时运行.切换到另一个用户时,前一用户的所有已打开程序和窗口都将暂停并保持原装,不受干扰.当再次切回时,所有一切都像原来一样,所不同的只是时间变了. 2.4.1 在菜单栏上显示快速用户切换菜单 打开"系统偏好设置",点击"用户与群组→解锁→登

《I&#039;m a Mac:雄狮训练手册》——2.3 账户类型

2.3 账户类型 I'm a Mac:雄狮训练手册 用户的社会属性并不决定它的计算机角色,虽然这个世界上有成千上万的Mac用户,形形色色,但是Mac认不过来,它才不管你是美国总统还是平头百姓.用户是指人,账户是指OS分配给用户的系统角色. Mac下的账户类型有五种:超级用户(Super User),管理员,普通用户,客人用户和仅限共享. 2.3.1 超级用户 超级用户也叫root用户,享有对计算机的绝对控制权限,可以任意删除和移动任何文件,所以Mac默认不启用.因为权力太大.当一个人的权力大到无

《I&#039;m a Mac:雄狮训练手册》——2.2 用户账户

2.2 用户账户 I'm a Mac:雄狮训练手册 用户和账户是两个概念,用户是指人,账户是指赋予用户的系统身份,也就是登录凭证,Mac ID.一个用户要登录系统首先要有一个账户,以下为方便说明,假设二者一致. Mac下所有账户和登录都是通过"用户与群组"偏好设置来进行设置.所以要对登录和账户进行设置,首先要打开"用户与群组"偏好设置. 2.2.1 "用户与群组"偏好设置 打开"用户与群组"偏好设置,有五种方式. (1)打开&

《I&#039;m a Mac:雄狮训练手册》——序章 0.1 Mac

序章 0.1 Mac I'm a Mac:雄狮训练手册 苹果电脑共有3种类型:掌上型.膝上型和桌面型. 掌上型也叫平板电脑,膝上型也叫笔记本,桌面型也叫台式机. 0.1.1 笔记本 笔记本原来有3种:MacBook.MacBook Air和MacBook Pro,分别简称MB.MBA和MBP.Macbook是苹果的入门级电脑产品,因塑料全白外壳而得名小白,但小白的命运比较坎坷,曾经一度被拿掉,后来又上,又被拿掉,2012年苹果宣布不再生产白色塑料外壳的MacBook.因为和MBA和MBP相比,小

《I&#039;m a Mac:雄狮训练手册》——0.2 OS X

0.2 OS X I'm a Mac:雄狮训练手册 用乔布斯的话说,Mac之所以是Mac,是因为Mac OS.硬件是骨架,软件是灵魂,正是因为Mac OS才让Mac是Mac.否则,它与PC没有什么不同,只是漂亮一些,电路板整齐一些. Mac是苹果电脑,OS X是装在苹果电脑上的操作系统.以前叫做Mac OS X,Lion之后叫做OS X,去掉Mac的概念是因为苹果想淡化Mac的概念.搭载在Mac上的操作系统可以有很多,OS X是原配,最新版本是10.7,叫做Lion. Mac OS有两个版本,一

《I&#039;m a Mac:雄狮训练手册》——1.7 shift键在开机时的作用

1.7 shift键在开机时的作用 I'm a Mac:雄狮训练手册shift键在开机时的作用有三:①在开机"咚"声时按住shift键将以安全模式启动:②在屏幕闪烁时按住shift键将取消自动登录:③在白屏时按住shift键将取消系统重返和停止加载登录项. 1.7.1 以安全模式启动在开机"咚"声时按住shift直到看到灰色的Apple Logo和进度指示器表示以安全模式启动.所谓安全模式是仅加载核心进程,强制对启动卷宗进行目录检查,并停用一切与系统核心无关的应用,

《I&#039;m a Mac:雄狮训练手册》——0.6 如何快速熟悉Mac

0.6 如何快速熟悉Mac I'm a Mac:雄狮训练手册(1)要了解系统相关的设置,请看"系统偏好设置". (2)要查看程序的功能,请看菜单栏. (3)想知道程序都可以做那些设置,请看程序"偏好设置"(按command,或者点击"'程序'菜单→偏好设置"). (4)要了解电脑的信息,请查看"系统信息"("Launchpad/实用工具/系统信息"或者按住option点击"图片 19菜单→系统信息

《I&#039;m a Mac:雄狮训练手册》——1.6 查看开机信息

1.6 查看开机信息 I'm a Mac:雄狮训练手册Mac的一个设计原则就是隐藏一切与用户无关的信息,不需要你知道的不让你知道,不需要你看到的不让你看到,一切从简,所以在开机的时候你只会听见一个简单的"咚"声和看到一个简单的画面,但其实在这些简单的表面背后有很多复杂的操作.只不过用幕布遮起来不需要用户看到,因为用户关注应用,而不需要看到内核. 如果你要查看Mac的启动过程和开机信息,就可以Verbose模式启动. 开机时按command-V,将以Verbose模式,也就是详细模式启动

《I&#039;m a Mac:雄狮训练手册》——1.8 以32位模式启动

1.8 以32位模式启动 I'm a Mac:雄狮训练手册Lion是64位系统,如果你想以32位模式启动,就可以在开机"咚"声时同时按住数字键3和2以32位模式启动.Mac下的开机设置,都是一次设置,单次有效,下次开机时则正常启动,所以下次开机时系统则以默认的64位方式启动. 查看系统是32位还是64位如果你没有以32位模式启动,则默认是64位. 打开"系统信息"(按住option点击"→系统信息..."),点击"软件",就可

《I&#039;m a Mac:雄狮训练手册》——1.9 恢复磁盘助理

1.9 恢复磁盘助理 I'm a Mac:雄狮训练手册Lion内置了恢复功能,让你可以无须安装盘即可恢复Mac.在开机"咚"声时按住command-R将会直接打开Lion的恢复磁盘助理(相当于按住option,然后选择Recovery HD磁盘). 通过此Recovery HD你可以修复磁盘.重装系统.在外部驱动器上创建Lion恢复,从TimeMachine备份恢复或使用Safari浏览网页. 注:要创建外部Lion恢复,请下载Lion恢复磁盘助理应用程序.插入外部驱动器并启动Lion