【问题标题】:Camera2 control image orientationCamera2 控制图像方向
【发布时间】:2020-02-29 15:27:43
【问题描述】:

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

例如,从模拟器拍照会将图像旋转 90 度(旋转的图像,不是预览),在我的华为上,图像没有旋转。

奇怪的是,屏幕旋转和传感器方向值在模拟器和华为上是相同的。 那么 jpeg 方向究竟是如何设置的呢?

同时探索CaptureRequest.JPEG_ORIENTATION

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

我注意到这个方法对模拟器完全没有影响

我尝试在保存位图后从ExifInterface 获取JPEG 方向,但在模拟器和华为中,该值都是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;
    }

使用此方法从ImageReader获取Bitmap

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】:

    模拟器是使用 Camera2 API 的一个非常糟糕的起点。本质上,它支持 LEGACY Camera2,但有一些怪癖。

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

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

    【讨论】:

    • 是的,我的主要问题和困惑是 BitmapFactory.decodeByteArray() 忽略了 Exif 数据
    • JPEG_ORIENTATION 的值似乎对我的 Pixel 3a 上的实际数据也没有影响。有什么方法可以解决这个问题,或者至少有一种旋转图像的方法,而且在性能方面并不昂贵?
    • @DaveNottage 这是一个可悲的事实。我想知道 Android 12 平台对 AVIF 图像的支持将对此有何帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多