Android前置摄像头图像保存颠倒

标签 android camera android-camera orientation

我正在构建一个使用相机功能的 Android 应用程序。我遇到的问题是从前置摄像头获取的图像数据 (byte[]) 在我的三星 s7 和 Nexus 手机上颠倒过来。它在预览中显示正确,但在我按原样保存数据然后在图库中显示图像后,它们全部颠倒了。我知道我可以在保存之前翻转图像数据,但我已经在运行 4.4 (kitkat) 的 blu C 5.0 HD 上测试了代码,并且该手机上的图像数据以正确的方式定向。所以翻转图像总是会导致其他设备上的错误。有人告诉我,这个问题是因为在生产新的三星和 Nexus 手机时,前置摄像头是倒置的,以节省空间。我不确定这是否正确,但如果是这样,如果我翻转所有图像,它会弄乱具有正确相机方向的手机。那么有没有办法在保存图像之前检测图像数据的方向呢?

这是我正在使用的代码:

mCamera.takePicture(null, null, mPicture);

回调:

private final Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        processCameraCallback(data);
    }
};

处理数据:

    public void processCameraCallback(byte[] data) {
    confirmPhoto(true);
    //Make a new empty picture file
    try {
        pictureFile = Utils.createImageFile();
    } catch (IOException ex) {
        // Error occurred while creating the File
        Log.e(TAG, "Failed to create photo file: " + ex.toString());
        confirmPhoto(false);
        return;
    }

    //Write the file to the storage
    try {
        FileOutputStream fos;
        if (pictureFile != null) {

            fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        }
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
        confirmPhoto(false);
        return;
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
        confirmPhoto(false);
        return;
    }
}

最佳答案

使用此代码调整相机方向:

private  int detectCameraDisplayOrientation(Activity activity,
                                            Camera.CameraInfo info) {

    int rotation = activity.getWindowManager().getDefaultDisplay()
            .getRotation();
    int degrees = 0;
    switch (rotation) {
        case Surface.ROTATION_0: degrees = 0; break;
        case Surface.ROTATION_90: degrees = 90; break;
        case Surface.ROTATION_180: degrees = 180; break;
        case Surface.ROTATION_270: degrees = 270; break;
    }

    int result;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        result = (info.orientation + degrees) % 360;
        result = (360 - result) % 360;  // compensate the mirror
    } else {  // back-facing
        result = (info.orientation - degrees + 360) % 360;
    }
   return result;
}

这来自相机 API 示例,在 Nexus 5x 上可以正常工作。(使用倒置相机)

之后只需调用 camera.setDisplayOrientation(displayOrientation); 并且它会正确保存图片。

关于Android前置摄像头图像保存颠倒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37103571/

相关文章:

android - Google map Android API v2 - 简单的 map 应用程序崩溃

android - 确保 URL 是否提供 JSON

ipad - 如何查看 iPad 当前版本的相机操作?

java - 我如何在LWJGL中看到 "Jump"?

java - 在 Nexus 上拍摄照片时,自定义相机显示暗图片预览

android - 相机打开时如何处理按下 "back"按钮

安卓相机旋转

Android:重复 Activity onBackPressed()

安卓任务 killer

iphone - iPhone 不支持 ExposureMode AVCaptureExposureModeAutoExpose