如何知道相机拍摄的照片的方向? [复制]

Posted

技术标签:

【中文标题】如何知道相机拍摄的照片的方向? [复制]【英文标题】:How to know the orientation of picture taken by the Camera? [duplicate] 【发布时间】:2019-03-19 20:00:15 【问题描述】:

我正在制作一个应用程序,在该应用程序中,我必须在服务中每隔一秒拍摄一张照片,而无需启动相机预览。

我在服务中写了以下代码,可以拍照了。

if (cameraId < 0) 
    Log.d(TAG, "No camera found");
 
else 

   camera = Camera.open(cameraId);
   camera.startPreview();

camera.takePicture(null, null, bitmapHandler);

在 bitmapHandler 类中,我在

中获取捕获图像数据
@Override
public void onPictureTaken(byte[] data, Camera camera) 
.
.
.

    当我以纵向模式拍照时,生成的图像顺时针旋转 90 度。 当我在横向模式下拍照时,生成的图像是正确的。 当我在反向横向模式下拍照时,生成的图像旋转了 180 度 当我在反向模式下拍照时,生成的图像旋转了 270 度 我做了什么来获得正确的图像,以便我可以将该图像输入我的神经网络。

我尝试了什么:当图像以纵向模式拍摄时,我将位图旋转了 90,但仍然无法找到图像是在哪种模式下拍摄的。

Camera API 有没有办法知道或控制旋转角度?

【问题讨论】:

设备方向不是Camera API的一部分,但您可以从设备中找到它 How to detect when the device switch from portrait to landscape mode?Rotating phone quickly 180 degrees, camera preview turns upside down 感谢@AlexCohn,我可以使用 OrientationEventListener 在我的服务中获取轮换更改信息 【参考方案1】:

我使用的是fixImageOrientation函数,参数是图像本身和图像文件的路径(作为第二个参数,我传递的是相机活动存储临时图像文件的路径)

    public static Bitmap rotateImage(Bitmap bmp, float angle)
    
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        System.out.println("Rotating image " + Float.toString(angle) + " degrees, rotateImage()");
        return Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
    

    public static Bitmap fixImageOrientation(Bitmap bmp, String path)
    
        ExifInterface ei;
        boolean changed = true;
        try 
            ei = new ExifInterface(path);
            int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

            if (orientation == ExifInterface.ORIENTATION_ROTATE_90)
                bmp = rotateImage(bmp, 90);
            else if (orientation == ExifInterface.ORIENTATION_ROTATE_180)
                bmp = rotateImage(bmp, 180);
            else if (orientation == ExifInterface.ORIENTATION_ROTATE_270)
                bmp = rotateImage(bmp, 270);
            else
                changed = false;

         catch (IOException e)
            System.out.println("IOException, image probably has no exif data, fixImageOrientation()");
            e.printStackTrace();

        

        if (changed)
        
            System.out.println("Image orientation fixed, fixImageOrientation()");

        
        else
        
            System.out.println("Image orientation did not change, fixImageOrientation()");
        

        return bmp;
    

【讨论】:

它在我保存捕获的图像然后尝试 Exif 数据的情况下工作。但就我而言,我不需要保存图像,只想将相同的图像输入神经网络模型。 如何使用相机 API 拍摄图像。

以上是关于如何知道相机拍摄的照片的方向? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cordova 相机插件拍摄多张照片

确保照片以与拍摄时相同的方向保存?

使用原生 iOS 相机应用程序拍摄的照片总是 UIImage 方向向上

离子:每张照片/拍摄多张照片后,相机都会要求确认

使用 Android Camera API,拍摄照片的方向始终未定义

根据设备方向转动相机图片 (Xamarin.iOS)