自定义相机预览颤动

问题描述 投票:0回答:1

如何创建具有特定尺寸的自定义CameraPreview并以相同尺寸保存拍摄的照片? (颤抖)

如果相机小部件尺寸为 400x150,则图像也应为 400x150。

flutter dart camera
1个回答
0
投票

将依赖项添加到 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;
  }
}

我希望这能解决您的问题,

© www.soinside.com 2019 - 2024. All rights reserved.