Flutter 相机包:相机的 Stream/Picture 旋转 -90°
Flutter Camera Package: Stream/Picture from Camera is -90° rotated
我在 2 个 Flutter 应用程序中使用官方 Flutter(Flutter 1.22.6 • 通道稳定)相机插件 (https://pub.dev/packages/camera)。 stripped-down 截取的代码用于两个应用程序(纯复制和粘贴)。
但是,两个应用程序的结果在方向上有所不同。问题是没有在屏幕上为用户提供正确的输出。这可以使用 CameraPreview
或 RotatedBox
。我正在使用 CameraController
中的 buildPreview()
方法来查看“相机看到的内容”(至少我希望如此)。
需要的是从 CameraController-Stream 中以正确的方向(笔直向上)录制一张图片,以便使用一些 AI SDK 对其进行处理。
或者作为变通方法,使用一些简单轻便的方法将其旋转 90 度作为 Uint8List
。不可能的是只用一些 meta-data.
应该值得一提的是比较复杂的app(旋转错误的地方)有两个限制:
- 在常规下的 iOS 项目中,没有选择设备方向,并且选中了“需要全屏”下方的一点。
- 应用程序在 main-Method 中初始化
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
我已经尝试过但没有成功的:
- 使两个应用中的方向和“需要全屏”配置相同。
- 在 initState
中设置 SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
- 使用
await controller.lockCaptureOrientation(DeviceOrientation.portraitUp);
- 从 iOS Podfile
中删除了所有相机插件限制
我不知道为什么会有这种差异。任何我应该尝试的想法或者这将是惊人的!
import 'dart:async';
import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Timer timer;
CameraController controller;
CameraImage image;
Future<CameraController> init;
@override
void initState() {
init = initialize();
super.initState();
}
Future<CameraController> initialize() async {
var cameras = await availableCameras();
controller = CameraController(cameras[0], ResolutionPreset.medium);
await controller.initialize();
controller.startImageStream((image) {
this.image = image;
});
timer = Timer.periodic(Duration(seconds: 5), (timer) async {
print('start scanning');
});
return controller;
}
Future<void> outText(CameraImage image) async {
Uint8List bytes = image.planes[0].bytes;
// AI magic...
return;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: FutureBuilder<CameraController>(
future: init,
builder: (context, snapshot) {
if (snapshot.hasData)
return Center(
child: snapshot.hasData
? SizedBox(child: snapshot.data.buildPreview())
: CircularProgressIndicator());
else
return SizedBox.shrink();
},
),
),
);
}
}
几个小时后,唯一的区别是两个结果之间的相机插件版本。
这似乎是 camera: ^0.7.0
及更高版本出现的错误。
要获得正确的结果,解决方法是使用:camera: ^0.6.4+5
或更早的版本。
我在 2 个 Flutter 应用程序中使用官方 Flutter(Flutter 1.22.6 • 通道稳定)相机插件 (https://pub.dev/packages/camera)。 stripped-down 截取的代码用于两个应用程序(纯复制和粘贴)。
但是,两个应用程序的结果在方向上有所不同。问题是没有在屏幕上为用户提供正确的输出。这可以使用 CameraPreview
或 RotatedBox
。我正在使用 CameraController
中的 buildPreview()
方法来查看“相机看到的内容”(至少我希望如此)。
需要的是从 CameraController-Stream 中以正确的方向(笔直向上)录制一张图片,以便使用一些 AI SDK 对其进行处理。
或者作为变通方法,使用一些简单轻便的方法将其旋转 90 度作为 Uint8List
。不可能的是只用一些 meta-data.
应该值得一提的是比较复杂的app(旋转错误的地方)有两个限制:
- 在常规下的 iOS 项目中,没有选择设备方向,并且选中了“需要全屏”下方的一点。
- 应用程序在 main-Method 中初始化
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
我已经尝试过但没有成功的:
- 使两个应用中的方向和“需要全屏”配置相同。
- 在 initState 中设置
- 使用
await controller.lockCaptureOrientation(DeviceOrientation.portraitUp);
- 从 iOS Podfile 中删除了所有相机插件限制
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
我不知道为什么会有这种差异。任何我应该尝试的想法或者这将是惊人的!
import 'dart:async';
import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Timer timer;
CameraController controller;
CameraImage image;
Future<CameraController> init;
@override
void initState() {
init = initialize();
super.initState();
}
Future<CameraController> initialize() async {
var cameras = await availableCameras();
controller = CameraController(cameras[0], ResolutionPreset.medium);
await controller.initialize();
controller.startImageStream((image) {
this.image = image;
});
timer = Timer.periodic(Duration(seconds: 5), (timer) async {
print('start scanning');
});
return controller;
}
Future<void> outText(CameraImage image) async {
Uint8List bytes = image.planes[0].bytes;
// AI magic...
return;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: FutureBuilder<CameraController>(
future: init,
builder: (context, snapshot) {
if (snapshot.hasData)
return Center(
child: snapshot.hasData
? SizedBox(child: snapshot.data.buildPreview())
: CircularProgressIndicator());
else
return SizedBox.shrink();
},
),
),
);
}
}
几个小时后,唯一的区别是两个结果之间的相机插件版本。
这似乎是 camera: ^0.7.0
及更高版本出现的错误。
要获得正确的结果,解决方法是使用:camera: ^0.6.4+5
或更早的版本。