Android camera2拍照旋转角度,以及镜像

您所在的位置:网站首页 余干中学初中部考多少分能进去 Android camera2拍照旋转角度,以及镜像

Android camera2拍照旋转角度,以及镜像

2024-01-19 19:55| 来源: 网络整理| 查看: 265

一、拍照照片旋转90度。

路径:packages\apps\Camera2 找到三个CaptureRequest.JPEG_ORIENTATION ,修改为解决:

src/com/android/camera/one/v2/SimpleOneCameraFactory.java:199:                rootBuilder.setParam(CaptureRequest.JPEG_ORIENTATION, src/com/android/camera/one/v2/OneCameraImpl.java:401:                builder.set(CaptureRequest.JPEG_ORIENTATION, src/com/android/camera/one/v2/OneCameraZslImpl.java:824:                builder.set(CaptureRequest.JPEG_ORIENTATION,

rootBuilder.setParam(CaptureRequest.JPEG_ORIENTATION, 90); //旋转90度 二、预览旋转90度

src/com/android/camera/TextureViewHelper.java

构造方法里:

mPreview.setRotation(90); 三、拍照存盘镜像

路径:packages\apps\Camera2\src\com\android\camera

diff --git a/apps/Camera2/src/com/android/camera/Storage.java b/apps/Camera2/src/com/android/camera/Storage.java index 6023f2b11..6eab98b9d 100755 --- a/apps/Camera2/src/com/android/camera/Storage.java +++ b/apps/Camera2/src/com/android/camera/Storage.java @@ -42,6 +42,10 @@ import java.io.IOException; import java.util.HashMap; import java.util.UUID; import java.util.concurrent.TimeUnit; +import android.graphics.Matrix; +import com.android.camera.util.CameraUtil; +import java.io.ByteArrayOutputStream; + import javax.annotation.Nonnull; @@ -277,12 +281,35 @@ public class Storage { public static Uri updateImage(Uri imageUri, ContentResolver resolver, String title, long date, Location location, int orientation, ExifInterface exif, byte[] jpeg, int width, int height, String mimeType) throws IOException { + + int i = 2; + + if(i == 1){ //源码 Log.d(TAG, "updateImage:" + width + "x" + height + ",jpeg:" + (jpeg == null ? 0 : jpeg.length) + ",orientation:" + orientation); String path = generateFilepath(title, mimeType); writeFile(path, jpeg, exif); return updateImage(imageUri, resolver, title, date, location, orientation, jpeg.length, path, width, height, mimeType); + + }else { //镜像再存盘 + Bitmap bitmap = CameraUtil.makeBitmap(jpeg, width * height); + Matrix m = new Matrix(); + m.postScale(-1, 1); // 镜像水平翻转 + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); + byte[] jpegData = baos.toByteArray(); + + Log.d(TAG, "updateImage:" + width + "x" + height + ",jpeg:" + (jpeg == null ? 0 : jpeg.length) + + ",orientation:" + orientation); + String path = generateFilepath(title, mimeType); + writeFile(path, jpegData, exif); + return updateImage(imageUri, resolver, title, date, location, orientation, jpegData.length, path, + width, height, mimeType); + } }

最近用Android camera2做自定义相机,基本的关于打开相机到预览的过程就不多叙述了

大家参看https://github.com/gengqifu/361Camera这个文章就可以知道

今天详细讲讲我开过程中遇到的旋转角度的问题

直接上代码:

//初始化传感器定位 orientationEventListener = object : OrientationEventListener(mActivity) { override fun onOrientationChanged(orientation: Int) { Log.e("orientation", "orientation=$orientation") sensorOrientation = when (orientation) { -1 -> ORIENTATION_VERTICAL in 70..134 -> 90 in 135..224 -> 180 in 225..280 -> 270 else -> 0 //这里应该是281-69的范围 } } } orientationEventListener.enable()

这就是相机中 传感器定位的回调代码,是kotlin的代码。

代码以一个竖直平面,360度内旋转

正常应该是以45-134 135-224 225-314 315-45 这样4个区间

每90度一个区间平均分,但是实际开发中 我们判断为横屏拍照时,手机几乎得是旋转90度 才代表用户是横屏

所以我加大了orientation为0的这样一个角度区间 减小了orientation为90和270的这样一个区间(判定为横屏拍照的区间)。

因此可以根据需求,调整你的区间 达到需求的目的。

上面是我们手机在竖直拍照时,水平拍照时怎么处理喃?在这里插入图片描述 大家看到我的log日志中有个orientation为-1,这说明手机这时候已经水平放置了

这个时候你在水平面内 左右旋转这个orientation都不会改变 都是-1

因此我们在-1的时候,其实就默认是竖屏拍照就可以了,这是一个很容易忽略的点。

val captureBuilder = cameraDevice?.createCaptureRequest( CameraDevice.TEMPLATE_STILL_CAPTURE )?.apply { if (::previewImageReaderSurface.isInitialized) { addTarget(previewImageReaderSurface) } set( CaptureRequest.JPEG_ORIENTATION, CameraUtil.getJpegOrientation( CameraConfig.getCurrentCameraCameraCharacteristics(), sensorOrientation ) ) if (lightIsOpened()) { set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON) set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH) } else { set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF) } set( CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH ) set( CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE ) //锁定焦点 set( CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START ) //手机水平拍摄的时候 设置成VERTICAL if (sensorOrientation == ORIENTATION_VERTICAL) { set(CaptureRequest.JPEG_ORIENTATION, 90) } }

这就是在拍照前,对相机的一些列设置 最后一个就是判断手机是水平时 将输出图片的orientation设置为90就可以了

我测试了手机自带的相机,水平拍摄时也是同样的处理方式。



【本文地址】


今日新闻


推荐新闻


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