关于自定义相机照片横竖屏转换问题的解决

来源:互联网 发布:免费数据统计分析软件 编辑:程序博客网 时间:2024/05/16 14:38

在自定义相机中,横竖屏拍照时,其显示的图片与预览的时候方向不一致,有以下2种方法:
第一种:比较普遍,

                /**                  * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转                  */                 int degree = readPictureDegree(f.getAbsolutePath());                  BitmapFactory.Options opts=new BitmapFactory.Options();//获取缩略图显示到屏幕上                opts.inSampleSize=2;                Bitmap cbitmap=BitmapFactory.decodeFile(f.getAbsolutePath(),opts);                /**                  * 把图片旋转为正的方向                  */                 Bitmap newbitmap = rotaingImageView(degree, cbitmap);                  iv.setImageBitmap(newbitmap);

当然,在第一种的基础上,如果获取的degree一直为0,但照片角度还不对时,就要用到第二种方法:

//监听屏幕的方向mScreenOrientationEventListener=new OrientationEventListener(this) {            @Override            public void onOrientationChanged(int orientation) {                // TODO Auto-generated method stub                // i的范围是0~359                  // 屏幕左边在顶部的时候 i = 90;                  // 屏幕顶部在底部的时候 i = 180;                  // 屏幕右边在底部的时候 i = 270;                  // 正常情况默认i = 0;                  if(45 <= orientation && orientation < 135) {                      screen = ExifInterface.ORIENTATION_ROTATE_180;                  } else if(135 <= orientation && orientation < 225) {                      screen = ExifInterface.ORIENTATION_ROTATE_270;                  } else if(225 <= orientation && orientation < 315) {                      screen = ExifInterface.ORIENTATION_NORMAL;                  } else {                      screen = ExifInterface.ORIENTATION_ROTATE_90;                  }              }        };
holder.addCallback(new SurfaceHolder.Callback() {                @Override                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {                    if (camera != null) {                        Camera.Parameters parameters = camera.getParameters();                        /* 设置相片格式为JPEG */                        parameters.setPictureFormat(PixelFormat.JPEG);                        switch (screen) {                        case 0:                            parameters.setRotation(90);                            break;                        case 90:                            parameters.setRotation(0);                            break;                        case 180:                            parameters.setRotation(270);                            break;                        case 270:                            parameters.setRotation(180);                            break;                        default:                            break;                        }                           switch (screen) {                        case 0:                            camera.setDisplayOrientation(90);                            break;                        case 90:                            camera.setDisplayOrientation(0);                            break;                        case 180:                            camera.setDisplayOrientation(270);                            break;                        case 270:                            camera.setDisplayOrientation(180);                            break;                        default:                            break;                        }                        camera.startPreview();                    }                }                @SuppressLint("NewApi")                @Override                public void surfaceCreated(SurfaceHolder holder) {                    try {                        camera = Camera.open();                        // 设置camera预览的角度,因为默认图片是倾斜90度的                        camera.setDisplayOrientation(90);                        // 设置holder主要是用于surfaceView的图片的实时预览,以及获取图片等功能                        camera.setPreviewDisplay(holder);                    } catch (Exception e) {                        if (camera != null) {                            camera.release();                            camera = null;                        }                        e.printStackTrace();                    }                }                @Override                public void surfaceDestroyed(SurfaceHolder holder) {                    if (camera != null) {                        camera.stopPreview();                        camera.release();                        camera = null;                    }                }            });

通过以上方法,自定义相机图片旋转类似的问题基本都可以解决
有问题欢迎交流 QQ 2240405944

0 0
原创粉丝点击