android摄像头旋转花屏,Android OpenGL YUV 旋转花屏解决、Camera获取图像

news/2024/7/8 7:47:57

一个自拍app,如何获取我们的surface view的截屏?

在Camera的onPreviewFrame回调中(继承的PreviewCallback接口)。我们可以获取到data数组,里面存放着就是实时的图片

data数组转文件为null,且转bitmap也为null怎么办?

data数组里确实存放的是图片,但是格式不对,是YUV420格式。需要进行一个转换。所以采用open gl包下的YuvImage这个类可以解决转化的问题,他有一个compressToJpeg方法。

转换成jpg格式,存到手机文件中,发现图片与拍摄出来的不符合,是经过90度旋转的图像怎么办(这里采用的是手机前置摄像头)?

对byte数组进行1.旋转2.镜像翻转(避免获取出来是反的)即可。再给算法处理后的新数组交给YUV去转换即可。

转换出来发现方向是对了,但是花屏了怎么办(这里是屏幕中出现了4个人并且重影了)?

是因为对byte数组旋转后,比如原来是100*200,旋转后就成了200*100,这个时候你不能把100,200分别交给YUV的宽高了,因为你大小都没指定对,解码自然会错误。而是应该给200,100。

代码

图片数组public voidonPreviewFrame(byte[] data, Camera camera) {

就是这个data

顺时针旋转270度代码private byte[] rotateYUVDegree270AndMirror(byte[] data, intimageWidth, intimageHeight) {byte[] yuv = new byte[imageWidth * imageHeight * 3/ 2];// Rotate and mirror the Y lumainti = 0;intmaxY = 0;for(intx = imageWidth - 1; x >= 0; x--) { maxY = imageWidth * (imageHeight - 1) + x * 2;for(inty = 0; y < imageHeight; y++) { yuv[i] = data[maxY - (y * imageWidth + x)]; i++; } }// Rotate and mirror the U and V color componentsintuvSize = imageWidth * imageHeight; i = uvSize;intmaxUV = 0;for(intx = imageWidth - 1; x > 0; x = x - 2) { maxUV = imageWidth * (imageHeight / 2- 1) + x * 2+ uvSize;for(inty = 0; y < imageHeight / 2; y++) { yuv[i] = data[maxUV - 2- (y * imageWidth + x - 1)]; i++; yuv[i] = data[maxUV - (y * imageWidth + x)]; i++; } }returnyuv;}

使用Camera.Size previewSize = mCamera.getParameters().getPreviewSize();//获取照相机宽高byte[] newData = rotateYUVDegree270AndMirror(data, previewSize.width, previewSize.height);

交换宽高传入YUVYuvImage yuvimage = newYuvImage( newData, ImageFormat.NV21, previewSize.height,//这里交换了宽高 previewSize.width,null);

解码,宽高也是反向传入FileOutputStream f = null;try{ f = newFileOutputStream(file);} catch(FileNotFoundException e) { e.printStackTrace();}yuvimage.compressToJpeg(newRect(0, 0, previewSize.height, previewSize.width), 100, f);try{ f.flush(); f.close();} catch(IOException e) { e.printStackTrace();}

搞定了,经过解码、旋转、镜像翻转、IO的byte数组,成功转化成正常图片文件保存到了本地!


http://www.niftyadmin.cn/n/3660184.html

相关文章

华为为什么以前不用鸿蒙,不用鸿蒙的原因来了:会让华为增长变慢

华为有点实力啊~~~华为有点实力啊~~~前些日子&#xff0c;华为方面发布了国产操作系统“鸿蒙OS”(以下简称鸿蒙系统)&#xff0c;当时就有消息称华为Mate30系列手机将会首发鸿蒙系统&#xff0c;但就在16号&#xff0c;华为掌门任正非在接受采访时表示&#xff1a;华为如果使用…

微软美国techED 2006 10 大看点

1. The CTP 1 release of SQL Server Everywhere. 微软的面向移动的数据库技术测试版本.2. The Beta 2 drop of WinFS. 微软新一代文件系统,原本将作为Vista和longhorn的一部分发布。但据最新消息&#xff0c;Windows Server chief Bob Muglia 表示&#xff0c;它可能会作为微软…

TechEd 2006 微软揭开SharePoint 2007 新特性LOBi

6月12日&#xff0c;TechEd 2006 大会上&#xff0c;微软官方表示&#xff0c;Office 小组正在实现一个目标&#xff0c;提供一个Office Business Application Services&#xff08;OBA) 和 Line of Business Interoperability (LOBi) 技术框架&#xff0c;将企业的商业环境整合…

android 禁止媒体扫描,Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件...

Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息&#xff0c;比如开机、插拔SD卡、设备连接上电脑这种涉及到可能更改文件系统内容的情况下&#xff0c;会触发系统扫描文件系统中的多媒体文件变化情况并同步到媒体数据库中&#xff1b;或者应…

TIOBE 2006年6月最流行开发语言排名 VB 窜升

TIOBE 语言排名一个月更新一次。它的统计方法是基于全球有经验的工程师&#xff0c;科目和第三方厂商. 同时也参考来自google,msn,yahoo等搜索引擎计算得出的结果。当然&#xff0c;这个排名并不说明哪个语言绝对最好&#xff0c;但是它可以给你一个参考&#xff0c;当你构建一…

html跨页面传数组,如何把一个页面的对象数组传到另外一个页面,没有后台,存js_html/css_WEB-ITnose...

我有两个页面&#xff0c;没有后台&#xff0c;只是用HTML实现。比如我有1.html和2.html两页面。在1.html中有一个temp数组&#xff0c;数组是存放image对象。1.html中有一个提交按钮&#xff0c;点击提交按钮&#xff0c;会打开2.html页面&#xff0c;并把temp数组传到2.html中…

织梦通过访问更新文章HTML,织梦每分钟审核一篇文章并且更新网站首页

plus下新建文件 makeid.php 内容如下&#xff1a;-----------------------------------------------------------------------------------------------------------------------$lasttimefilemtime($_SERVER[DOCUMENT_ROOT]."/index.html");$interval180; //更新时间…

html页面不延迟加载图片,网页加载加速 之 图片延迟加载

大家还在为网页加载速度而烦恼吗&#xff1f;大家有发现网页在某些浏览器很快&#xff0c;而在某些浏览器却很慢吗&#xff1f;今天向大家介绍一下为何会出现这些情况&#xff0c;并给大家分享一下具体的实现方法1.先向大家讲解一下为何需要图片延迟加载大家知道图片的常见格式…