Как исправить неправильное вращение фотографии с камеры во флаттере? - PullRequest
1 голос
/ 11 февраля 2020

Я делаю фотографию с последней версией плагина камеры и использую код из примера флаттера. Вот как я выбираю камеру:

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

Это внутри init:

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

Это остальная часть соответствующего кода:

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);
  }
}

Впоследствии , Я показываю фотографию пользователю с Image.file(File(_imagePath)) и позже отправляю фотографию в API. Проблема в том, что фотография иногда получается с неправильной ориентацией. (Я уверен в этом, потому что фотография также поворачивается в базе данных.) Например, на 3-летнем телефоне Xiaomi он работает безупречно, но на определенном новом телефоне Samsung фотография всегда поворачивается.

Как убедиться, что вращение всегда правильно? (Даже на ios устройствах)

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вы можете использовать пакет https://pub.dev/packages/flutter_exif_rotation
Поддержка iOS и Android
В некоторых устройствах exif-данные показывают изображение в ландшафтном режиме, когда они на самом деле в портретной ориентации.
Этот плагин фиксирует ориентацию для снимков, сделанных этими устройствами.

Для Android
Добавьте это в свой AndroidManifest.xml

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

фрагмент кода

image = await FlutterExifRotation.rotateImage(path: image.path);

//Note : iOS not implemented
image = await FlutterExifRotation.rotateAndSaveImage(path: image.path);
0 голосов
/ 18 марта 2020

Это мое решение, которое работает кроссплатформенно и не использует плагины.

import 'dart:io';
import 'package:exif/exif.dart';
import 'package:image/image.dart' as img;

Future<File> fixExifRotation(String imagePath) async {
    final originalFile = File(imagePath);
    List<int> imageBytes = await originalFile.readAsBytes();

    final originalImage = img.decodeImage(imageBytes);

    final height = originalImage.height;
    final width = originalImage.width;

    // Let's check for the image size
    // This will be true also for upside-down photos but it's ok for me
    if (height >= width) {
      // I'm interested in portrait photos so
      // I'll just return here
      return originalFile;
    }

    // We'll use the exif package to read exif data
    // This is map of several exif properties
    // Let's check 'Image Orientation'
    final exifData = await readExifFromBytes(imageBytes);

    img.Image fixedImage;

    if (height < width) {
      logger.logInfo('Rotating image necessary');
      // rotate
      if (exifData['Image Orientation'].printable.contains('Horizontal')) {
        fixedImage = img.copyRotate(originalImage, 90);
      } else if (exifData['Image Orientation'].printable.contains('180')) {
        fixedImage = img.copyRotate(originalImage, -90);
      } else if (exifData['Image Orientation'].printable.contains('CCW')) {
        fixedImage = img.copyRotate(originalImage, 180);
      } else {
        fixedImage = img.copyRotate(originalImage, 0);
      }
    }

    // Here you can select whether you'd like to save it as png
    // or jpg with some compression
    // I choose jpg with 100% quality
    final fixedFile =
        await originalFile.writeAsBytes(img.encodeJpg(fixedImage));

    return fixedFile;
  }

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...