zoukankan      html  css  js  c++  java
  • android Camera拍照 及 MediaRecorder录像 预览图像差90度

    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); 这个方法并不能改变预览的角度,这个方法会改变保存后的视频文件播放时是否是横向。根据用户的习惯,最后也添加这个代码保证在播放视频是是横向的。

  • 相关阅读:
    Azure PowerShell (2) 修改Azure订阅名称
    Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户
    Azure PowerShell (3) 上传证书
    Azure PowerShell (1) PowerShell入门
    Windows Azure Service Bus (2) 队列(Queue)入门
    Windows Azure Service Bus (1) 基础
    Windows Azure Cloud Service (10) Role的生命周期
    Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
    Android studio 使用心得(一)—android studio快速掌握快捷键
    android 签名、混淆打包
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3656706.html
Copyright © 2011-2022 走看看