正确显示竖屏预览和拍照的照片

1、预览时正确显示

      主要参考系统相机代码实现getDisplayOritation就可以了
    

 //在preview之前调用setDisplayOrientation
      int degrees = getDisplayOritation(getDispalyRotation(), cameraId);
      mCamera.setDisplayOrientation(degrees);
      mCamera.startPreview();

      
     getDisplayOritation函数如下:
 

  private int getDisplayOritation(int degrees, int cameraId) {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId, info);
        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;
        } else {
            result = (info.orientation - degrees + 360) % 360;
        }
        return result;
    }
    
    private int getDispalyRotation() {
        int i = getWindowManager().getDefaultDisplay().getRotation();
        switch (i) {
        case Surface.ROTATION_0:
            return 0;
        case Surface.ROTATION_90:
            return 90;
        case Surface.ROTATION_180:
            return 180;
        case Surface.ROTATION_270:
            return 270;
        }
        return 0;
    }

2、显示图片时正确显示

     竖屏拍照的照片,直接使用的话,会旋转90度

     参考系统图库的代码,需要先查询mediascanner的orientation字段,然后应用再把角度旋转过来,这样显示就ok了

     参考代码如下:

           假设c为查询mediaprovider数据库返回的cursor

          

 int rotation = c.getInt(c.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION));
            if (rotation != 0) {
                Bitmap bitmap = BitmapFactory.decodeFile(path);
                imageBefore.setImageBitmap(bitmap);
                Matrix m = new Matrix();
                m.setRotate(rotation);
                Bitmap transformed = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
                return transformed;
            }


转载于:https://my.oschina.net/u/1028833/blog/312577

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值