Android Camera2控制图像方向

Android Camera2控制图像方向,android,camera,android-camera,android-camera2,Android,Camera,Android Camera,Android Camera2,我基于Googlecamera2sample创建了摄像头屏幕,所有代码几乎相同,摄像头拍摄照片并以JPEG格式保存在设备上,但我有一些奇怪的行为 例如,从emulator拍照将图像旋转90度(图像已旋转,而不是预览),在我的华为手机上,图像未旋转 奇怪的是,Emulator和华为的屏幕旋转和传感器方向值完全相同。 那么jpeg的方向是如何设置的呢 此外,在探索CaptureRequest.JPEG\u方向时 captureBuilder.set(CaptureRequest.JPEG_ORIEN

我基于Google
camera2
sample创建了摄像头屏幕,所有代码几乎相同,摄像头拍摄照片并以
JPEG
格式保存在设备上,但我有一些奇怪的行为

例如,从emulator拍照将图像旋转90度(图像已旋转,而不是预览),在我的华为手机上,图像未旋转

奇怪的是,Emulator和华为的屏幕旋转和传感器方向值完全相同。 那么jpeg的方向是如何设置的呢

此外,在探索
CaptureRequest.JPEG\u方向时

captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation))
我注意到,这种方法对Emulator根本没有影响

位图保存后,我曾尝试从
ExifInterface
获取
JPEG
方向,但在Emulator和华为中,该值均为
orientation\u未定义
。可能在将
图像
(从
图像读取器
)转换为
文件
Exif
标记时被忽略

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

使用此方法获得方向(来自Google camera2示例),Emulator和华为的结果为90度

private int getOrientation(int rotation) {
        return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360;
    }
使用此方法从
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;
}

Emulator是使用Camera2 API的一个非常糟糕的起点。本质上,它支持传统的Camera2,但也有一些古怪之处

这就是说,Jpeg定位在Android摄像头上是一个非常微妙的话题。官方文件解释说,旋转请求可能适用于图像本身,也可能仅适用于EXIF标志,但一些设备(您测试了哪些华威?)根本不符合要求


另请注意,
BitmapFactory.decodeByteArray()
,.

是的,我的主要问题和困惑是
BitmapFactory.decodeByteArray()
忽略
Exif
数据
JPEG\U方向
的值似乎对我的像素3a上的实际数据也没有影响。有没有办法解决这个问题,或者至少有一种方法可以使图像旋转,而且成本不高,性能也不差?@DaveNottage这是一个令人悲哀的事实。我想知道安卓12平台的AVIF图像支持将如何帮助这一点。