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);