Search code examples
flutterdartandroid-camera

How to fix wrong rotation of photo from camera in flutter?


I'm taking a photo with the newest camera plugin version and I'm using code from flutter example. This is how I pick a camera:

final cameras = await availableCameras();
final firstCamera = cameras.first;

This is inside init:

_cameraController = CameraController(
  widget.camera,
  ResolutionPreset.medium,
  enableAudio: false,
);

This is the rest of the relevant code:

Future _takePhoto(BuildContext context) async {
  try {
    await _initializeControllerFuture;
    final path = join(
      (await getTemporaryDirectory()).path,
      '${DateTime.now()}.png',
    );

    await _cameraController.takePicture(path);

    setState(() {
      _imagePath = path;
    });
  } catch (e) {
    print(e);
  }
}

Afterwards, I show the photo to the user with Image.file(File(_imagePath)) and later I send the photo to API. The problem is that the photo is sometimes captured with a wrong orientation. (I'm sure about this because the photo is also rotated in the database.) For example, on 3 years old Xiaomi phone, it works flawlessly, but on a certain new Samsung phone, the photo is always rotated.

How to make sure that the rotation is always correct? (Even on ios devices)


Solution

  • You can use package https://pub.dev/packages/flutter_exif_rotation
    Support iOS and Android
    In some devices the exif data shows picture in landscape mode when they're actually in portrait.
    This plugin fixes the orientation for pictures taken with those devices.

    For Android
    Add this in your AndroidManifest.xml

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    code snippet

    image = await FlutterExifRotation.rotateImage(path: image.path);
    
    //Note : iOS not implemented
    image = await FlutterExifRotation.rotateAndSaveImage(path: image.path);