【flutter从网络地址获取文件(File类型、通过图片网络地址获取Uint8List)】

本文介绍了如何在Flutter中使用DefaultCacheManager从网络地址获取File和Uint8List类型的数据,包括图片的压缩处理。还提供了两种方法,一种通过CacheManager,另一种直接使用http库下载并可能压缩图片。

1.从网络地址获取File类型文件

// 使用 DefaultCacheManager 类(可能无法自动引入,需要手动引入)
import 'package:flutter_cache_manager/flutter_cache_manager.dart';

 //从网络地址获取File类型文件
  Future<File> _getFileFromUrl(String url) async {
    Completer<File> _completer = new Completer<File>();
    final File file = await DefaultCacheManager().getSingleFile(url);
    _completer.complete(file);
    return _completer.future;
  }

2.从网络地址获取Uint8List类型数据

// 使用 DefaultCacheManager 类(可能无法自动引入,需要手动引入)
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:image/image.dart' as image;

 /**
* 从图片网络地址获取Uint8List类型数据
* 图片过大时,通过while循环调用Uint8List.fromList(image.encodeJpg(thumbnail,quality: _quality))进行图片压缩
* 缺点:压缩过程中占用、无法渲染(如果使用loading动画,动画会卡在第一帧直到压缩完成)
**/
 
Future<Uint8List> _compressImage(String imageUrl) async {
    Completer<Uint8List> _completer = new Completer<Uint8List>();
    final File file = await DefaultCacheManager().getSingleFile(imageUrl);
    final image.Image thumbnail =
    image.decodeImage(file.readAsBytesSync());
    Uint8List thumbData = thumbnail.getBytes();

    if (thumbData.length > 1024 * 1024 * 0.5) {
      int _quality = 90;
      print("图片初始大小:${thumbData.length/ 1024 /1024}MB");
      while(thumbData.length > 1024 * 1024 * 0.5 && _quality > 0){
        thumbData = Uint8List.fromList(image.encodeJpg(thumbnail,quality: _quality));
        _quality -= 2;
      }
      print("图片压缩后大小:${thumbData.length} ${thumbData.length/ 1024 / 1024}MB");
    }
    _completer.complete(thumbData);
    return _completer.future;
  }
//  调用
  Uint8List imageData =  await _compressImage(_imageUrl);

2.从网络地址获取Uint8List类型数据的第二种方法

//引入http库
dependencies:  
  flutter:  
    sdk: flutter  
  http: ^0.13.5
import 'dart:typed_data';  
import 'package:http/http.dart' as http;  
import 'package:image/image.dart' as image;

/*
  * 从图片网络地址获取Uint8List数据
  * */
Future<Uint8List> getImageBytesFromUrl(String url,bool toCompress) async {
    Completer<Uint8List> _completer = new Completer<Uint8List>();
    final response = await http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      Uint8List _thumbData = Uint8List.fromList(response.bodyBytes);
      print('response.data= $_thumbData');
      if(toCompress){
        if (_thumbData.length > 1024 * 1024 * 0.5) {
         final image.Image thumbnail = image.decodeImage(_thumbData);
          int _quality = 90;
          print("图片初始大小:${_thumbData.length/ 1024 /1024}MB");
          while(_thumbData.length > 1024 * 1024 * 0.5 && _quality > 0){
            _thumbData = Uint8List.fromList(image.encodeJpg(thumbnail,quality: _quality));
            _quality -= 4;
          }
          print("图片压缩后大小:${_thumbData.length} ${_thumbData.length/ 1024 / 1024}MB");
        }
      }
      _completer.complete(_thumbData);
    } else {
      _completer.complete(null);
    }
    return _completer.future;
  }

//调用
String _imageUrl = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201805%2F01%2F20180501111110_kfxqs.jpg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1712560747&t=5e2ed5074c3ebed786e7d93a44b436f5';
 Uint8List imageData =  await getImageBytesFromUrl(_imageUrl,true);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值