设置 Android 照片 EXIF 方向

Posted

技术标签:

【中文标题】设置 Android 照片 EXIF 方向【英文标题】:Setting Android Photo EXIF Orientation 【发布时间】:2014-06-06 00:16:19 【问题描述】:

我编写了一个以编程方式捕获照片的 android 活动。我想将图像保存为具有正确 EXIF 方向数据的 JPEG(就像本机 Android 相机应用程序自动执行的操作一样)。

这是实际拍照的方法(我删除了 try/catch 块):

private void takePhoto() 

    camera = Camera.open();
    SurfaceTexture dummySurfaceTexture = new SurfaceTexture(0);
    camera.setPreviewTexture(dummySurfaceTexture);
    camera.startPreview();
    camera.takePicture(null, null, jpgCallback);

...和回调:

private Camera.PictureCallback jpgCallback = new Camera.PictureCallback() 
    public void onPictureTaken(byte[] data, Camera camera) 

        releaseCamera();
        savePhoto(data);
;

照片拍摄正确,但我的问题是 EXIF 数据显示方向设置为“图像方向:顶部,左手”,无论设备的方向如何,所以当我上传照片时出现颠倒或旋转。

我真的需要手动捕获设备方向(滚动、俯仰、方位角)并自己编写 EXIF 方向吗?相机应用程序如何自动正确写入这些数据?有谁知道正确设置此属性的方法吗?

编辑:我无法使用屏幕方向,因为 Activity 被锁定为纵向模式。

【问题讨论】:

我已经阅读了这个答案,但由于我的活动被锁定为纵向模式,因此无法使用。 ***.com/questions/13245556/… 【参考方案1】:

您不必自己编写 EXIF 方向,但您需要在拍照前告诉相机子系统您设备的方向。它自己无法访问该信息。设置后,相机子系统将设置 EXIF 字段或旋转图像数据以正确定位图像(这取决于您的特定设备)。

要告诉相机您想要拍摄静态照片的方向,请使用Camera.Parameters.setRotation():

开发者文档中有关于如何正确使用它的参考代码,这有点棘手,因为您设置的值取决于 1)相机传感器的方向和 2)您的 UI 的方向,相对于设备的正常方向。我在这里复制了示例代码,它使用 OrientationEventListener 并假设您有一个名为 mParameters 的 Camera.Parameters 对象:

 public void onOrientationChanged(int orientation) 
   if (orientation == ORIENTATION_UNKNOWN) return;
   android.hardware.Camera.CameraInfo info =
        new android.hardware.Camera.CameraInfo();
   android.hardware.Camera.getCameraInfo(cameraId, info);
   orientation = (orientation + 45) / 90 * 90;
   int rotation = 0;
   if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 
     rotation = (info.orientation - orientation + 360) % 360;
    else   // back-facing camera
     rotation = (info.orientation + orientation) % 360;
   
   mParameters.setRotation(rotation);

那么在你调用takePicture之前,你需要调用Camera.setParameters(mParameters)。

在您的特定情况下,您可能希望在拍照之前查询方向,并使用示例代码中的逻辑来计算旋转。然后用Camera.getParameters()获取相机参数,调用setRotation,再调用Camera.setParameters()。

【讨论】:

【参考方案2】:
ExifInterface exif;
        try 
            exif = new ExifInterface(filePath);

            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION, 0);
            Log.d("EXIF", "Exif: " + orientation);
            Matrix matrix = new Matrix();
            if (orientation == 6) 
                matrix.postRotate(90);
                Log.d("EXIF", "Exif: " + orientation);
             else if (orientation == 3) 
                matrix.postRotate(180);
                Log.d("EXIF", "Exif: " + orientation);
             else if (orientation == 8) 
                matrix.postRotate(270);
                Log.d("EXIF", "Exif: " + orientation);
            

【讨论】:

以上是关于设置 Android 照片 EXIF 方向的主要内容,如果未能解决你的问题,请参考以下文章

利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题

iPhone OS 图像/照片大小调整工具更改 EXIF 方向数据

EXIF 方向参数 Orientation

JS 客户端 Exif 方向:旋转和镜像 JPEG 图像

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)