亲测解决:自定义相机Camera2前后置拍照时相片翻转、旋转等显示问题

您所在的位置:网站首页 前后翻转 亲测解决:自定义相机Camera2前后置拍照时相片翻转、旋转等显示问题

亲测解决:自定义相机Camera2前后置拍照时相片翻转、旋转等显示问题

2024-07-12 21:50| 来源: 网络整理| 查看: 265

一开始我遇到的问题是,前置拍照获得的照片各种旋转、 翻转,就是不能正常,解决后的前后置拍照得到的图片都正常了,效果图如下(看底部中间显示的相片):

        

自定义相机的实现,网上有很多代码了,我这里不贴全部的代码,就贴解决前后置拍照怎么处理照片使其正常 (记得给相关权限),布局中用到的是TextureView控件。

 

1.前后置时的SparseIntArray 设置(默认的是前置,一开始调用front())

private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); private void front() { //前置时,照片竖直显示 ORIENTATIONS.append(Surface.ROTATION_0, 270); ORIENTATIONS.append(Surface.ROTATION_90, 0); ORIENTATIONS.append(Surface.ROTATION_180, 90); ORIENTATIONS.append(Surface.ROTATION_270, 180); } private void rear() { //后置时,照片竖直显示 ORIENTATIONS.append(Surface.ROTATION_0, 90); ORIENTATIONS.append(Surface.ROTATION_90, 0); ORIENTATIONS.append(Surface.ROTATION_180, 270); ORIENTATIONS.append(Surface.ROTATION_270, 180); }

2.切换前后置相机时做的处理

private String mCameraId = "1";//摄像头id(通常0代表后置摄像头,1代表前置摄像头)(应该有个按钮可以改变前后置的) private CameraDevice cameraDevice; private CameraCaptureSession mPreviewSession; private CameraManager manager; //stateCallback是摄像头状态 private void switch(){ if ("1".equals(mCameraId)) {//前置变后置 mCameraId = "0"; rear(); }else {//其它全部变成前置(默认的是前置) mCameraId = "1"; front(); } if (mPreviewSession != null) { mPreviewSession.close(); mPreviewSession = null; } if (cameraDevice != null) { cameraDevice.close(); cameraDevice = null; } try { manager.openCamera(mCameraId, stateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } }

 3.获取拍照的照片,并对其进行处理,使其正常,在ImageReader.OnImageAvailableListener的onImageAvailable方法里面,代码如下处理:

// 获取捕获的照片数据 Image image = reader.acquireNextImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] data = new byte[buffer.remaining()]; buffer.get(data); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); //前置时左右翻转时处理,后置是正常的,不需要处理了 if ("1".equals(mCameraId)){ Matrix m = new Matrix(); m.postScale(-1, 1); // 镜像水平翻转 bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); } ivImage.setImageBitmap(bitmap); image.close();//一定要,不能会……,你试试看

 

如有更好的解决方法,请告知,谢谢!


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3