Flutter使用ImagePicker拍照后图片旋转方向错误问题求助
Flutter 拍照后图片方向异常修复方案
你当前使用的
image_picker默认返回的图片文件仅保留EXIF方向元数据,Flutter原生的Image组件渲染时不会自动读取EXIF中的方向参数,因此会出现拍照后显示方向与实际拍摄方向不符的问题。
最低改动修复方案
无需引入额外第三方库,仅需调整pickImage调用参数即可:
- 调用时传入
maxWidth、maxHeight任意非空数值,即可触发image_picker内置的EXIF方向自动修正逻辑 - 可配合
imageQuality参数控制输出图片大小,不会影响正常显示效果
修改后代码如下:
Future pickImage(ImageSource source) async { try { final image = await ImagePicker.pickImage( source: source, maxWidth: 1920, maxHeight: 1920, imageQuality: 90 ); if(image == null) return; final imageTemporary = File(image.path); date = DateTime.now().toString(); print(imageTemporary); setState(() { this.image = imageTemporary; this.date = date; }); } on PlatformException catch(e) { print('failed to pick image: $e'); } }
无压缩修复方案
如果你完全不需要修改图片原始尺寸和质量,可手动处理EXIF方向参数:
- 先在
pubspec.yaml中添加图像处理依赖:image: ^4.1.0 - 新增方向修正工具方法,处理图片后再赋值给状态
方向修正代码示例:
import 'package:image/image.dart' as img; Future<File> adjustImageOrientation(File rawImageFile) async { final imageBytes = await rawImageFile.readAsBytes(); final decodedImg = img.decodeImage(imageBytes)!; // 读取EXIF方向信息并应用旋转修正 final orientedImg = img.bakeOrientation(decodedImg); // 覆盖原文件保存修正后的图片 return await rawImageFile.writeAsBytes(img.encodeJpg(orientedImg, quality: 100)); }
在原有逻辑中调用上述方法即可:
final image = await ImagePicker.pickImage(source: source); if(image == null) return; final fixedImage = await adjustImageOrientation(File(image.path)); setState(() { this.image = fixedImage; });
注意:若使用0.8.x以下版本的image_picker,部分Android机型需要额外申请存储读取权限,否则会出现EXIF信息读取失败、方向修正不生效的问题。
内容的提问来源于stack exchange,提问作者Nero Chaniago
相关产品推荐
相关产品推荐

