一个自拍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数组,成功转化成正常图片文件保存到了本地!

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

  1. 2013新春奉送:Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,查询支持的picturesize, ImageButton按键效果)

    [补充:我已在对此代码进行了全面的升级,升级后代码结构更加利于维护扩展,全面适配所有手机,参见博文.此文中的资源也不要再下载了,请下载升级后的代码,如有问题请留言反馈,谢谢.------------- ...

  2. Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,查询支持的picturesize, ImageButton按键效果)

    这个代码几乎涉及到了摄像头开发的所有方面,(除了PreviewCallback,这块东西我会结合android摄像头自动识别人脸/火灾来谈),且力求精简,是杂家的心血阿!相对之前改进之处有: 1,精简 ...

  3. 2013新春奉送 Android摄像头开发完美demo--- 循环聚焦 缩放大小 旋转picture 查询支持的pict

    [补充:我已在对此代码进行了全面的升级,升级后代码结构更加利于维护扩展,全面适配所有手机,参见博文.此文中的资源也不要再下载了,请下载升级后的代码,如有问题请留言反馈,谢谢.------------- ...

  4. android摄像头预览功能,android通过camera和surfaceview选择摄像头并即时预览

    在使用android设备的摄像头的时候我们有两种选择: 1.调用intent方法使用摄像头 2.通过camera类使用摄像头 第一种方法非常方便,不过需要跳到新的activity中,这样的用户体验并不 ...

  5. android 摄像头同时打开方式,Android,同时打开前置和后置摄像头

    参见英文答案 > Using both front and back cameras simultaneously android                                 ...

  6. android 摄像头测血压,基于Android手机端的连续血压测量系统和校准测量方法

    基于Android手机端的连续血压测量系统和校准测量方法 [技术领域] [0001]本发明涉及血压连续测量技术领域,具体设计一种基于Android手机端的连续血压测量系统和校准测量方法,被测者可以直接 ...

  7. android摄像头监控打电话卡死,Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案...

    本文将带你了解Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案,希望本文对大家学Android有所帮助. Android8.0平台Camera monkey ...

  8. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

  9. Android摄像头 只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理 底层Surface

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

最新文章

  1. Android:FragmentTransaction
  2. 用计算机打印相片怎么调色,2018年底照片如何使用LOG模式进行调色
  3. 哪里不知道“瞄”哪里,这项AI黑科技,打开手机就能体验
  4. Unity 编辑器扩展 场景视图内控制对象
  5. PLSQL_解析过程及硬解析和软解析的区别(案例)
  6. Linux系统下的数据镜像备份工具——Rsync
  7. 表白编程代码python_python抖音表白程序源代码
  8. javascript-for-loop-example--reference
  9. hihoCoder1228(2015北京网络赛B题)
  10. Docker Toolbox在window 10 home 下挂载宿主机目录到容器的正确操作
  11. R软件的下载及安装(截图步骤详细)
  12. 转: Linux Grep 命令说明
  13. java 栈和队列实现迷宫代码_使用两个队列实现一个栈
  14. 变量、属性、函数、方法总结
  15. MATLAB数组生成、引用
  16. 前端中函数 , 伪函数 , DOM
  17. python英文词频统计代码_python词频统计_英文
  18. yolov3模型部署实战weights转onnx并推理
  19. C#基础语法————变量
  20. 将带逗号的字符串转换为数组

热门文章

  1. 在Windows系统中搭建PHP环境,PHP环境搭建-Windows系统下PHP环境搭建
  2. 如何在 Chromebook 上启用开发者模式
  3. SMETA验厂辅导,提出过不合规项的所有部分,应对以下内容有清楚的解释
  4. bootstraptable 超多列_Bootstrap mergeCells合并单元格(多列)
  5. Vue项目中将时间格式成xxxx-xx-xx
  6. SQL server 数据库单表查询前n%行
  7. 如何设置ddns动态域名实现内网发布外网
  8. 让lebel和radio/checkbox水平对齐
  9. BMZCTF:个人所得税
  10. AJAX基础入门实例教程(含代码)