Flutter如何实现相机拍照无论设备朝向都固定返回竖屏照片
Flutter 相机拍照强制固定竖屏稳定解决方案
核心思路
从拍照阶段底层控制+拍摄后兜底校正两个环节处理,避免单一环节机型适配问题。
步骤1:拍照时强制锁定捕捉方向(第一重保障)
直接调用官方camera库的系统级API锁定输出方向,从源头减少后期校正的需求:
import 'package:camera/camera.dart'; import 'dart:io'; Future<XFile> takeVerticalPhoto(CameraController controller) async { // 强制锁定捕捉方向为正竖屏 await controller.lockCaptureOrientation(DeviceOrientation.portraitUp); final XFile photo = await controller.takePicture(); // 按需选择是否解锁方向,需要始终竖屏拍照可保持锁定无需调用解锁 await controller.unlockCaptureOrientation(); return photo; }
注:该API已经自动适配安卓、iOS平台的底层方向逻辑,无需额外处理平台差异
步骤2:拍摄后全场景方向校正(兜底保障)
针对部分老旧机型底层锁定方向不生效的情况,手动覆盖所有8种EXIF方向场景处理,处理后清空EXIF方向信息避免二次旋转:
import 'package:image/image.dart' as img; import 'package:exif/exif.dart'; import 'dart:io'; Future<File> forceVerticalImage(String rawPhotoPath) async { final File rawFile = File(rawPhotoPath); final Uint8List rawBytes = await rawFile.readAsBytes(); final img.Image? originImage = img.decodeImage(rawBytes); final Map<String, IfdTag> exifInfo = await readExifFromBytes(rawBytes); // 无EXIF信息/解析失败直接返回原文件 if (exifInfo.isEmpty || originImage == null) return rawFile; // 提取方向数值 final int orientation = int.parse(exifInfo['Image Orientation']!.printable.split(' ').first); late img.Image fixedImage; switch (orientation) { case 1: // 正常方向无需处理 fixedImage = originImage; break; case 2: // 水平翻转 fixedImage = img.flipHorizontal(originImage); break; case 3: // 旋转180度 fixedImage = img.copyRotate(originImage, 180); break; case 4: // 垂直翻转 fixedImage = img.flipVertical(originImage); break; case 5: // 水平翻转后顺时针旋转90度 fixedImage = img.copyRotate(img.flipHorizontal(originImage), 90); break; case 6: // 顺时针旋转90度 fixedImage = img.copyRotate(originImage, 90); break; case 7: // 水平翻转后逆时针旋转90度 fixedImage = img.copyRotate(img.flipHorizontal(originImage), -90); break; case 8: // 逆时针旋转90度 fixedImage = img.copyRotate(originImage, -90); break; default: fixedImage = originImage; } // 清空EXIF方向信息,避免其他应用读取旧信息重复旋转 fixedImage.exif.clear(); // 写入处理后的文件,质量可按需调整 await rawFile.writeAsBytes(img.encodeJpg(fixedImage, quality: 90)); return rawFile; }
常见问题说明
- 原有仅判断180度的方案仅覆盖了1种异常场景,其余7种方向异常均未处理,所以会出现部分场景失效的问题
bakeOrientation偶发失效是因为部分机型的EXIF字段标记不标准,手动全分支判断兼容性更高- 无需引入第三方旋转库,上述逻辑依赖的
image、exif均为长期维护的主流通用库,适配性更强
内容的提问来源于stack exchange,提问作者LouisJoBiss
相关产品推荐
相关产品推荐

