如何创建具有特定尺寸的自定义CameraPreview并以相同尺寸保存拍摄的照片? (颤抖)
如果相机小部件尺寸为 400x150,则图像也应为 400x150。
将依赖项添加到 pubspec.yaml 文件中
dependencies:
camera: ^0.10.0+1
path_provider: ^2.0.11
初始化相机:
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final cameras = await availableCameras();
final firstCamera = cameras.first;
runApp(MyApp(camera: firstCamera));
}
class MyApp extends StatelessWidget {
final CameraDescription camera;
MyApp({required this.camera});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: TakePictureScreen(camera: camera),
);
} }
相机预览:
class TakePictureScreen extends StatefulWidget {
final CameraDescription camera;
TakePictureScreen({required this.camera});
@override
_TakePictureScreenState createState() => _TakePictureScreenState();
}
class _TakePictureScreenState extends State<TakePictureScreen> {
late CameraController _controller;
late Future<void> _initializeControllerFuture;
@override
void initState() {
super.initState();
_controller = CameraController(
widget.camera,
ResolutionPreset.high,
);
_initializeControllerFuture = _controller.initialize();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Take a picture')),
body: FutureBuilder<void>(
future: _initializeControllerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Center(
child: Container(
width: 400,
height: 150,
child: CameraPreview(_controller),
),
);
} else {
return Center(child: CircularProgressIndicator());
}
},
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
try {
await _initializeControllerFuture;
final image = await _controller.takePicture();
final croppedImage = await _cropImage(image.path);
// Save or use the cropped image
} catch (e) {
print(e);
}
},
child: Icon(Icons.camera_alt),
),
);
}
Future<File> _cropImage(String imagePath) async {
final image = img.decodeImage(File(imagePath).readAsBytesSync())!;
final cropped = img.copyCrop(image, 0, 0, 400, 150);
final croppedFile = File(imagePath)..writeAsBytesSync(img.encodeJpg(cropped));
return croppedFile;
}
}
我希望这能解决您的问题,