热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter调用相机/相册,多图选择,图片视频文件压缩上传处理

需要配置的插件:image_picker:^0.6.7+4multi_image_picker:^4.6.1flutte

需要配置的插件:

image_picker: ^0.6.7+4

multi_image_picker: ^4.6.1

flutter_image_compress: ^0.7.0

flutter_video_compress: ^0.3.7+8

代码片段:

/**

****

    PhotoVideo –> 图片视频 获取 压缩 formdata 上传 服务器 ,实用类

****

**/

class PhotoVideo {

/*拍照*/

  // ignore: override_on_non_overriding_member

  static _takePhoto() async {

    // ignore: deprecated_member_use

    File image = await ImagePicker.pickImage(source: ImageSource.camera);

    Navigator.pop(Router.navigatorState.currentState.context);

    _saveImage(image).then((value) => {

          /*   

          post 上传 block 传值一系列操作   

          */

        });

  }

/*相册 单图选择*/

  // ignore: unused_element

  static _openGallerySingle() async {

    // ignore: deprecated_member_use

    var image = await ImagePicker.pickImage(source: ImageSource.gallery);

    print(‘相册图片–>$image’);

    _saveImage(image).then((value) => {

          /*   

          post 上传 block 传值一系列操作   

          */

        });

    Navigator.pop(Router.navigatorState.currentState.context);

  }

  /*相册 多图选择*/

  static _openGallery() async {

    List resultList = List();

    try {

      resultList = await MultiImagePicker.pickImages(

        maxImages: 9,

        // 是否支持拍照

        enableCamera: true,

        materialOptions: MaterialOptions(

            // 显示所有照片, false时显示相册

            startInAllView: true,

            allViewTitle: ‘所有照片’,

            actionBarColor: ‘#1ba593’,

            textOnNothingSelected: ‘没有选择照片’,

            selectionLimitReachedText: ‘图片选择超出限制,最多选择9张’),

      );

    } catch (e) {

      print(e);

    }

    if (resultList.length > 0) {

      _saveImages(resultList).then((value) => {

            /*   

            post 上传 block 传值一系列操作   

            */

          });

    }

    Navigator.pop(Router.navigatorState.currentState.context);

  }

  /* 单图片压缩 与 flie存图*/

  static Future _saveImage(File file) async {

    File imageFile = await FlutterImageCompress.compressAndGetFile(

      file.absolute.path,

      Directory.systemTemp.path +

          ‘/userava’ +

          DateTime.now().millisecondsSinceEpoch.toString() +

          ‘.jpg’,

      quality: 50,

    );

    print(‘压缩后图片文件大小:’ + imageFile.lengthSync().toString());

    FormData formData = FormData.fromMap({

      ‘file’: await MultipartFile.fromFile(imageFile.path,

          filename: imageFile.path.substring(

              imageFile.path.lastIndexOf(“/”) + 1, imageFile.path.length))

    });

    return formData;

  }

  /*  多图片压缩 与 flie存图*/

  static Future _saveImages(List images) async {

    List fileList = List();

    for (int i = 0; i

      ByteData byteData = await images[i].getByteData(quality: 60);

      String name = DateTime.now().millisecondsSinceEpoch.toString() + “.jpg”;

      List imageData = byteData.buffer.asUint8List();

      MultipartFile multipartFile = MultipartFile.fromBytes(

        imageData,

        // 文件名

        filename: name,

        // // 文件类型

        // contentType: MediaType(“image”, “jpg”),

      );

      FormData formData = FormData.fromMap({‘file’: multipartFile});

      if (multipartFile != null) {

        fileList.add(formData);

      }

    }

    return fileList;

  }

  //视频压缩 初始化

  static final _flutterVideoCompress = FlutterVideoCompress();

  /*拍摄视频*/

  // ignore: unused_element

  static _getVideo() async {

    // ignore: deprecated_member_use

    var image = await ImagePicker.pickVideo(

        maxDuration: Duration(seconds: 10), source: ImageSource.camera);

    print(‘视频文件大小:’ + image.lengthSync().toString());

    Navigator.pop(Router.navigatorState.currentState.context);

    /* 视频的压缩上传 */

    _upLoadVideo(image);

  }

  /* 视频的压缩上传 */

  static _upLoadVideo(image) async {

    await _flutterVideoCompress

        .compressVideo(

          image.path,

          quality: VideoQuality.LowQuality, //  默认VideoQuality.DefaultQuality

          deleteOrigin: false, // 默认(false)

        )

        .then((value) async => {

              print(‘压缩后视频文件大小:’ + value.toJson().toString()),

              /*   

              post 上传 block 传值一系列操作   

              */

            });

  }

  /*选取视频*/

  // ignore: unused_element

  static _takeVideo() async {

    // ignore: deprecated_member_use

    var image = await ImagePicker.pickVideo(

        source: ImageSource.gallery, preferredCameraDevice: CameraDevice.front);

    print(‘相册选取的视频文件:$image’);

    /*

      暂时没有更好的办法,先原文件上传

    */

    Navigator.pop(Router.navigatorState.currentState.context);

  }

}

复制上述代码:调用即可,相册选取的视频压缩,有待完善,后期会更新…


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
author-avatar
渊博的大盗zhang_618
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有