Flutter相机滤镜插件my_filter_camera的使用

Flutter相机滤镜插件my_filter_camera的使用

Flutter相机滤镜插件my_filter_camera允许您在捕捉照片和视频时应用高级数字滤镜。该插件提供了一个无缝接口,可以实时为您的相机流添加效果,并以风格和创意捕捉瞬间。

功能

  • 捕捉带有高级实时滤镜的照片和视频。
  • 程序化地应用各种预定义或自定义数字效果。
  • 可调整的相机配置:亮度。
  • 支持前置和后置摄像头。
  • 高度可定制且易于集成到您的Flutter项目中。

功能表:

功能 支持
请求权限
启用/禁用音频
拍照
实时滤镜
曝光水平
设备闪光灯支持
实时切换摄像头

安装和使用

将包添加到您的pubspec.yaml
dependencies:
  my_filter_camera: ^latest_version
设置平台

Android

在您的AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
将包导入到您的项目
import 'package:my_filter_camera/my_filter_camera.dart';

然后,您可以使用相机功能。

初始化相机

final CameraViewController controller = CameraViewController();

显示相机预览小部件:

CameraView(
  autoDispose: false,
  controller: controller,
  onDetect: (data, args) {
    setState(() {});
  },
),
  • 使用controller.start()函数启动相机,并使用controller.stop停止相机。
  • 使用controller.switch()切换前后摄像头方向。

滤镜类型

Filter type

更新滤镜类型:

await controller.updateFilter(filterType: PluginFilterEnum.values[index].code);

您可以在PluginFilterEnum中找到所有滤镜列表。

捕获图像

Capture Image

捕获实时图像:

final xFile = await controller.capture();

曝光水平

调整相机曝光水平:

controller.adjustBrightness(value: value.toInt());

重要注意事项

记住在不再使用相机时停止或释放相机,以避免增加内存使用:

[@override](/user/override)
void dispose() {
  controller.dispose();
  super.dispose();
}
// 或者
controller.stop();

示例代码

以下是一个完整的示例演示如何使用my_filter_camera插件:

import 'dart:async';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/material.dart';
import 'package:my_filter_camera/my_filter_camera.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  runApp(const MaterialApp(home: CameraTestScreen()));
}

class CameraTestScreen extends StatefulWidget {
  const CameraTestScreen({super.key});

  [@override](/user/override)
  _CameraTestScreenState createState() => _CameraTestScreenState();
}

class _CameraTestScreenState extends State<CameraTestScreen> {
  final CameraViewController controller = CameraViewController();

  bool isStarted = false;
  double _currentSliderValue = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    controller.applyImageSample();
    _loadPreferences();
  }

  Future<void> _loadPreferences() async {
    // final prefs = await SharedPreferences.getInstance();
    // final int? brightnessValue = prefs.getInt('brightnessValue');
  }

  Future<void> _setPreferences({required int brightnessValue}) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setInt('brightnessValue', brightnessValue);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.transparent,
      body: Stack(
        children: [
          Positioned.fill(
            child: CameraView(
              autoDispose: false,
              controller: controller,
              onDetect: (data, args) {
                setState(() {});
              },
            ),
          ),
          Align(
            alignment: Alignment.bottomCenter,
            child: Container(
              height: 200,
              color: Colors.black.withOpacity(0.4),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Slider(
                    value: _currentSliderValue,
                    max: 50,
                    min: -50,
                    divisions: 101,
                    label: _currentSliderValue.round().toString(),
                    onChanged: (double value) {
                      setState(() {
                        _currentSliderValue = value;
                        controller.adjustBrightness(value: value.toInt());
                        _setPreferences(brightnessValue: value.toInt());
                      });
                    },
                  ),
                  Container(
                    height: 50,
                    child: ListView.builder(
                      itemCount: PluginFilterEnum.values.length,
                      scrollDirection: Axis.horizontal,
                      itemBuilder: (context, index) {
                        return ElevatedButton(
                          onPressed: () async {
                            await controller.updateFilter(
                              filterType: PluginFilterEnum.values[index].code,
                            );
                          },
                          child: Text(PluginFilterEnum.values[index].name),
                        );
                      },
                    ),
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      IconButton(
                        color: Colors.white,
                        icon: ValueListenableBuilder(
                          valueListenable: controller.cameraFacingState,
                          builder: (context, state, child) {
                            switch (state as CameraFacing) {
                              case CameraFacing.front:
                                return const Icon(Icons.camera_front);
                              case CameraFacing.back:
                                return const Icon(Icons.camera_rear);
                            }
                          },
                        ),
                        iconSize: 32.0,
                        onPressed: () => controller.switchCamera(),
                      ),
                      IconButton(
                        icon: const Icon(
                          Icons.camera_alt_outlined,
                          size: 40,
                          color: Colors.white,
                        ),
                        onPressed: () async {
                          final xFile = await controller.capture();
                          final utf8 = await xFile.readAsBytes();
                          showDialog(
                              context: context,
                              builder: (BuildContext context) {
                                return AlertDialog(
                                  title: const Text('图片预览'),
                                  content: ExtendedImage.memory(
                                    utf8,
                                    fit: BoxFit.cover,
                                    filterQuality: FilterQuality.high,
                                  ),
                                  actions: <Widget>[
                                    TextButton(
                                      child: const Text('关闭'),
                                      onPressed: () {
                                        Navigator.of(context).pop(); // 关闭对话框
                                      },
                                    ),
                                  ],
                                );
                              });
                        },
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

更多关于Flutter相机滤镜插件my_filter_camera的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter相机滤镜插件my_filter_camera的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用my_filter_camera插件来实现相机滤镜功能的代码案例。这个插件可以帮助你快速集成相机功能并应用滤镜效果。

首先,确保你已经在你的pubspec.yaml文件中添加了my_filter_camera插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  my_filter_camera: ^最新版本号 # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,创建一个Flutter项目并配置相机权限。在你的AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

对于iOS,需要在Info.plist中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>需要访问相机</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问照片库</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要保存照片到照片库</string>

然后,在你的main.dart文件中编写以下代码:

import 'package:flutter/material.dart';
import 'package:my_filter_camera/my_filter_camera.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CameraScreen(),
    );
  }
}

class CameraScreen extends StatefulWidget {
  @override
  _CameraScreenState createState() => _CameraScreenState();
}

class _CameraScreenState extends State<CameraScreen> {
  late MyFilterCameraController? _controller;

  @override
  void initState() {
    super.initState();
    _initCamera();
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  Future<void> _initCamera() async {
    _controller = await MyFilterCamera.createCameraController(
      cameraId: 0, // 0 for back camera, 1 for front camera
      enableAudio: true,
      enableFlash: false,
      enableTorch: false,
      enableTapToFocus: true,
      enableZoom: true,
      enablePreview: true,
      enablePictureInPicture: false,
    );

    // Apply a default filter, you can add more filters as needed
    _controller?.setFilter('grayscale');

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Camera with Filters'),
      ),
      body: _controller == null || !_controller!.value.isInitialized
          ? Center(child: CircularProgressIndicator())
          : Stack(
              children: [
                MyFilterCameraPreview(_controller!),
                Positioned(
                  bottom: 10,
                  left: 10,
                  child: Row(
                    children: [
                      ElevatedButton(
                        onPressed: () {
                          _applyFilter('grayscale');
                        },
                        child: Text('Grayscale'),
                      ),
                      ElevatedButton(
                        onPressed: () {
                          _applyFilter('sepia');
                        },
                        child: Text('Sepia'),
                      ),
                      ElevatedButton(
                        onPressed: () {
                          _applyFilter('blur');
                        },
                        child: Text('Blur'),
                      ),
                    ],
                  ),
                ),
              ],
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final XFile? image = await _controller?.captureImage();
          if (image != null) {
            // Save or display the captured image
            print(image.path);
          }
        },
        tooltip: 'Capture Image',
        child: Icon(Icons.camera_alt),
      ),
    );
  }

  void _applyFilter(String filterName) {
    _controller?.setFilter(filterName);
  }
}

这个代码示例展示了如何使用my_filter_camera插件来初始化相机,并应用一些基本的滤镜效果(如灰度、棕褐色和模糊)。你可以根据需要添加更多的滤镜选项。

请注意,my_filter_camera插件的API可能会随着版本的更新而变化,因此请参考插件的官方文档以获取最新的使用方法。

回到顶部