Camera2控制图像方向

问题描述 投票:1回答:1

我基于Google camera2示例创建了相机屏幕,所有代码几乎相同,相机拍摄并以JPEG格式将其保存在设备上,但是我有些奇怪的行为。

例如,从仿真器拍照将图像旋转90度(图像旋转,而不是预览),在我的华为上,图像未旋转。

奇怪的是,[[屏幕旋转和传感器方向值在Emulator和Huawei上都相同。那么如何精确设置jpeg方向?

也在探索CaptureRequest.JPEG_ORIENTATION

captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation))

我注意到

此方法对仿真器完全没有影响

我尝试在保存位图后从JPEG获取ExifInterface方向,但是在Emulator和Huawei中,该值为ORIENTATION_UNDEFINED。也许在将Image(从ImageReader)转换为File Exif标签时被忽略了?

也许我在拍摄图像时需要手动设置ExifInterface,但是如果值相同,有什么区别?我们应该如何控制JPEG方向?

使用此方法(从Google camera2示例获得方向)结果对于Emulator和Huawei是90度。

private int getOrientation(int rotation) { return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360; }

使用此方法从Bitmap获得ImageReader

public static Bitmap getBitmapFromReader(ImageReader reader) { Bitmap bitmap = null; Image image = null; try { image = reader.acquireLatestImage(); Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); buffer.rewind(); byte[] data = new byte[buffer.capacity()]; buffer.get(data); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } catch (Exception e) { e.printStackTrace(); } if (image != null) { image.close(); } return bitmap; }

android camera android-camera android-camera2
1个回答
0
投票
仿真器是使用Camera2 API的非常糟糕的起点。本质上,它具有LEGACY Camera2支持,并且有一些怪癖。

这就是说,Jpeg方向在Android相机上是一个非常微妙的话题。官方文档解释说,旋转请求可能仅适用于图像本身,也可能仅适用于EXIF标志,但某些设备(您测试过Huawai吗?)根本不符合要求。

还要注意BitmapFactory.decodeByteArray() ignores the EXIF flagsince the very beginning

热门问题
推荐问题
最新问题