【问题标题】:I am building a Photo editing app in flutter which can apply built in photo filters on an image picked from gallery我正在用颤振构建一个照片编辑应用程序,它可以在从图库中挑选的图像上应用内置的照片过滤器
【发布时间】:2020-11-01 18:01:48
【问题描述】:

我在每个插件的官方文档的帮助下编写了代码。尽管如此,我收到了下面提到的错误。任何人都可以帮助解决问题吗?

import 'dart:html';

import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
import 'package:path/path.dart';
import 'package:photofilters/photofilters.dart';
import 'package:image_picker/image_picker.dart';
import 'package:image/image.dart' as imageLib;

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  File _image;
  String fileName;
  Filter _filter;
  List<Filter> filters = presetFiltersList;
  final picker = ImagePicker();
  Future getImage() async {
    final pickedFile = await picker.getImage(source: ImageSource.gallery);
    fileName = basename(pickedFile.path);
    var image = imageLib.decodeImage(pickedFile.readAsBytesSync());
    setState(() {
      if (pickedFile != null) {
        _image = File(pickedFile.path);
      } else {
        print('No image selected.');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () {
          getImage();
          Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => PhotoFilterSelector(
                  image: _image,
                  filters: filters,
                  filename: fileName,
                  loader: Center(child: CircularProgressIndicator()),
                ),
              ));
        },
        label: Text("+"),
        icon: Icon(
          Icons.print,
          color: Colors.black,
        ),
      ),
    );
  }
}

错误:

  1. 没有为“PickedFile”类型定义“readAsBytesSync”方法。 尝试将名称更正为现有方法的名称,或定义名为“readAsBytesSync”的方法。

  2. 需要 2 个位置参数,但找到了 1 个。 尝试添加缺少的参数。

3.参数类型'String'不能赋值给参数类型'List'。

  1. 无法将参数类型“文件”分配给参数类型“图像”。

【问题讨论】:

    标签: flutter filter photo editing


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    第 1 步:使用 imageLib.Image _image; 而不是 File _image;
    第 2 步:使用_file.readAsBytesSync()

     File _file = File(pickedFile.path);
    _image = imageLib.decodeImage(_file.readAsBytesSync());
    

    第三步:onPressed需要使用asyncawait

    onPressed: () async{
              await getImage();
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'dart:io';
    import 'package:flutter/semantics.dart';
    import 'package:path/path.dart';
    import 'package:photofilters/photofilters.dart';
    import 'package:image_picker/image_picker.dart';
    import 'package:image/image.dart' as imageLib;
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      imageLib.Image _image;
      //File _image;
      String fileName;
      Filter _filter;
      List<Filter> filters = presetFiltersList;
      final picker = ImagePicker();
      Future getImage() async {
        PickedFile pickedFile = await picker.getImage(source: ImageSource.gallery);
        fileName = basename(pickedFile.path);
        File _file = File(pickedFile.path);
        _image = imageLib.decodeImage(_file.readAsBytesSync());
        setState(() {
          if (pickedFile != null) {
            //_image = File(pickedFile.path);
          } else {
            print('No image selected.');
          }
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          floatingActionButton: FloatingActionButton.extended(
            onPressed: () async{
              await getImage();
              Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => PhotoFilterSelector(
                      title: Text("Photo Filter Example"),
                      image: _image,
                      filters: filters,
                      filename: fileName,
                      loader: Center(child: CircularProgressIndicator()),
                    ),
                  ));
            },
            label: Text("+"),
            icon: Icon(
              Icons.print,
              color: Colors.black,
            ),
          ),
        );
      }
    }
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(),
        );
      }
    }
    

    【讨论】:

    • 感谢您的帮助。我写了这段代码,但是在应用过滤器后,没有将图像保存在图库中的选项,当我触摸刻度线按钮时,它会返回到第一个屏幕。你能告诉我如何解决吗?另外,如何使用 DNG 文件形式的自定义过滤器?
    • 很高兴为您提供帮助。如果对您有帮助,请将其标记为答案。
    • 对于您的其他问题,能否请您发布一个新问题,以便更多人可以帮助您。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多