如何知道相机拍摄的照片的方向?

时间:2018-10-15 11:37:46

标签: android image android-camera android-bitmap image-rotation

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

我在服务中编写了以下代码,并且能够拍照。

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) {
.
.
.
}
  1. 当我以人像模式拍摄照片时,所得图像会顺时针旋转90度。
  2. 当我以横向模式拍摄照片时,得到的图像是正确的。
  3. 当我以反向风景模式拍照时,结果图像将旋转180度
  4. 当我以反肖像模式拍照时,所得图像旋转270度 我做了什么来获取适当的图像,以便可以将该图像提供给我的神经网络。

我尝试过的方法:当以人像模式拍摄图像时,我将位图旋转了90,但仍然无法找到以哪种模式拍摄图像。

Camera API是否可以知道或控制旋转角度?

1 个答案:

答案 0 :(得分:0)

我正在使用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;
    }