Camera拍照:

今天做照相机程序,结果写好了发现出问题了,预览的图像差90度。相关源代码如下:

Camera.Parameters params = camera.getParameters();
       params.setPreviewSize(width, height);
       params.setPreviewFrameRate(4);
       params.setPictureFormat(PixelFormat.JPEG);
       params.set("jpeg-quality", 85);
       params.setPictureSize(width, height);
       camera.setParameters(params);
       camera.setPreviewDisplay(sHolder);
       camera.startPreview();
       camera.autoFocus(null);

于是在网上搜索,发现确实存在这样一个问题,网上的解决方法也各不一致。最后用setDisplayOrientation()方法解决了,修改后的代码如下:

Camera.Parameters params = camera.getParameters();
       params.setPreviewSize(height, width);                1
       params.setPreviewFrameRate(4);
       params.setPictureFormat(PixelFormat.JPEG);
       params.set("jpeg-quality", 85);
       params.setPictureSize(height, width);                2
       camera.setParameters(params);
       camera.setDisplayOrientation(90);                    3
       camera.setPreviewDisplay(sHolder);
       camera.startPreview();
       camera.autoFocus(null);

首先添加了代码3,让Camera旋转90度。测试时发现虽然图像转回正常,但是上下却拉长了。进过研究修改代码1,把长宽颠倒。再测试预览正常了,但是拍照的时候获取的图片却依然是拉长的,于是修改代码2。这回拍照正常,但是仍然存在一个问题,保存的图片是横着的。

看网上很多人都遇到了这个问题,好像与系统有关,既然没法在Camera这里搞定,那么就将获取的Bitmap进行旋转。程序里通过重写PictureCallback的onPictureTaken来获取图片,代码是

Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);

在这里可以对bm进行旋转,代码如下:

Bitmap bm0 = BitmapFactory.decodeByteArray(data, 0, data.length);
      Matrix m = new Matrix();
      m.setRotate(90,(float) bm0.getWidth() / 2, (float) bm0.getHeight() / 2);
      final Bitmap bm = Bitmap.createBitmap(bm0, 0, 0, bm0.getWidth(), bm0.getHeight(), m, true);

这样保存的图片就正常了!

MediaRecorder录像:

同样的预览问题在录像中也出现了,但是由于是用MediaRecorder进行录像,没有Camera对象,一时比较无措。后来经过网友的提醒,想到了MediaRecorder有setCamera()的方法,于是添加如下代码:

Camera c = Camera.open();
            c.setDisplayOrientation(90);
            c.unlock();
            mRecorder.setCamera(c);

这样预览的问题就解决了!至于网上很多人说添加mRecorder.setOrientationHint(90); 这个方法并不能改变预览的角度,这个方法会改变保存后的视频文件播放时是否是横向。根据用户的习惯,最后也添加这个代码保证在播放视频是是横向的。

android Camera拍照 及 MediaRecorder录像 预览图像差90度的更多相关文章

  1. Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理

    Android Lollipop 添加了Camera2 API,并将原来的Camera API标记为废弃了.相对原来的Camera API来说.Camera2是又一次定义的相机 API,也重构了相机 ...

  2. Android Camera开发:给摄像头预览界面加个ZoomBar(附完整代码下载)

    源码:http://files.cnblogs.com/android100/StandardCamera2013-10-18.zip 废话不说了,就是加个seekbar,拖动的话能够调节焦距,让画面 ...

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

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

  4. 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率

    今晨,谷歌推出了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化,其中包含对 Android Go (设备运行内存小于等于 1 GB)和加速设备上对机器学习的全新神经网 ...

  5. Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器

    前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ...

  6. 18.libgdx制作预览图,背景移动循环,改变地图颜色

    经过构思,游戏将分为两部分, 1,预览图,只负责展示世界形势 2,根据预览图生成的战役项 现在要记录的是我制作预览图的部分 1.预览图只有实际地图的1/4,首先生成地图(建议不要缩放以前地图,由于误差 ...

  7. 为Unity的新版ugui的Prefab生成预览图

    using UnityEngine;using System.Collections;using UnityEditor;using System.IO; [CustomPreview(typeof( ...

  8. HTML5-video标签-实现点击预览图播放或暂停视频

    HTML5-video标签-实现点击预览图播放或暂停视频 刚刚参加工作,开始更多的接触到一些新的知识,促使我开始了解html5和css3的新特性.这时我才真的发现到html5和css3的强大. 之前关 ...

  9. 可拖拽和带预览图的jQuery文件上传插件ssi-uploader

    插件描述:ssi-uploader是一款带预览图并且可以拖拽文件的jQuery ajax文件上传插件.该文件上传插件支持AJAX,支持多文件上传,可控制上的文件格式和文件大小,提供各种回调函数,使用非 ...

随机推荐

  1. linux禁止root用户直接登录sshd并修改默认端口

    linux最高权限用户root,默认可以直接登录sshd.为了提高服务器的安全度,需要对它进行禁止,使得攻击者无法通过暴力破解来获取root权限. 1,新建一个用户: #useradd xxx (xx ...

  2. CSS3 @keyframes 语法

    http://www.w3chtml.com/css3/rules/@keyframes.html <!DOCTYPE html><html lang="zh-cn&quo ...

  3. linux下的ImageMagick安装方法

     linux下的ImageMagick安装方法  由于没有图形化界面的支持,在Linux(CentOS 6.4 x64)上的配置相对Windows XP还是麻烦了一点.   1.下载ImageMagi ...

  4. javascript 字符串转数字

    //把str转换为数字的方式,想起很久以前的一个面试题,说字符转数字的方式有哪些,现在想了想 var str1='4.88',str2='4.8xx'; console.log(parseInt(st ...

  5. Ubuntu开机自动挂载Windows分区

    转自Ubuntu 12.04开机自动挂载Windows分区 1.查看系统磁盘号 sd2,sd5,sd7分别对应我windows的C,D,F盘,也是本次要添加到开机挂载的,E盘为wubi安装盘. 2.查 ...

  6. Android软件开发之获取通讯录联系人信息

    Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来. 这一篇文章我主要带领同学们熟悉Android的通讯录机制. 图中选中 ...

  7. 时区 : America/Mexico_City 中文:美国中部时间(墨西哥城) 的夏令时

    方法: (参数为: TimeZone timeZone = TimeZone.getTimeZone("America/Mexico_City"); private static ...

  8. 【HDOJ】2732 Leapin' Lizards

    贪心+网络流.对于每个结点,构建入点和出点.对于每一个lizard>0,构建边s->in position of lizard, 容量为1.对于pillar>0, 构建边in pos ...

  9. 两款.net 下编辑器小结

    在asp.net 状态下,有两款不错的网页编辑器,分别是freetextbox和fckeditor,网上不少文章介绍之,现归纳之 1 freetextox      安装时引用freetexbox.d ...

  10. wps操作记录

    WPS Excel 1.点击插入---形状:画好方框,选中后右键“编辑文字”,在方框中加入你需要的文字信息 2.点击插入---形状:画出连接线,按住SHIFT拖动可以水平或垂直的直线 3.调整位置.选 ...