import 'dart:io';
import 'dart:typed_data';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:logger/logger.dart';
import 'dart:ui' as ui show Image, Codec, FrameInfo;
import '../../common.dart';
import 'dart:ui' as ui show Image, Codec, FrameInfo;
import 'package:path_provider/path_provider.dart';
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;
import 'package:image/image.dart' as img;
import 'package:path_provider/path_provider.dart';
/// 剪裁和压缩图片
/// [插件]
/// # 文件读写目录
/// path_provider: 1.4.0
/// extended_image: ^1.3.0
/// # 图片压缩
/// flutter_image_compress: ^0.7.0
/// path: ^1.6.2
/// image: ^2.0.7
/// http: ^0.12.0+1
class ExtendedImageExt extends StatefulWidget {
final image;
final width;
final height;
final fit;
final cache;
final quality;
const ExtendedImageExt(this.image,
{Key key,
this.width,
this.height,
this.fit = BoxFit.cover,
this.cache = true,
this.quality = 10})
: super(key: key);
@override
_ExtendedImageExtState createState() => _ExtendedImageExtState();
}
class _ExtendedImageExtState extends State<ExtendedImageExt>
with SingleTickerProviderStateMixin {
AnimationController _controller;
/// 文件所在目录(临时或者永久)
File _imageFile;
/// 已经处理过的图片
Uint8List _imageFileB;
@override
void initState() {
_controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 3),
lowerBound: 0.0,
upperBound: 1.0);
super.initState();
_fetchImage();
}
/// 渲染图片
_fetchImage() async {
// Logger().d('_fetchImage');
final url = widget.image;
final res = await http.get(url);
// Logger().d(res);
final image = img.decodeImage(res.bodyBytes);
// Logger().d(image);
// * 2中方式
Directory appDocDir = await getApplicationDocumentsDirectory();
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path; // 临时文件夹
// String appDocPath = appDocDir.path; // 应用文件夹
final imageFile =
File(path.join(tempPath, Common.getRandString() + '.png')); // 保存在应用文件夹内
await imageFile.writeAsBytes(img.encodePng(image)); // 需要使用与图片格式对应的encode方法
_imageFile = imageFile;
// Uint8List _imageFileOrgin = await _imageFile.readAsBytes();
// Image.memory(fileBytes, gaplessPlayback: true,),
// 打印各种属性以验证文件保存成功
// print(imageFile.path);
// print(imageFile.statSync());
Uint8List result = await FlutterImageCompress.compressWithFile(
_imageFile.path,
minWidth: 750,
minHeight: 1334,
quality: widget.quality,
);
Logger().d('_imageFileB');
_imageFileB = result;
if (mounted) {
setState(() {});
}
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
width: widget.width,
height: widget.height,
child: ExtendedImage.network(
widget.image,
fit: BoxFit.contain,
cache: widget.cache,
loadStateChanged: (ExtendedImageState state) {
switch (state.extendedImageLoadState) {
case LoadState.loading:
_controller.reset();
return Container(
width: Common.width(50),
height: Common.width(50),
child: CupertinoActivityIndicator(
radius: Common.width(24),
),
);
break;
case LoadState.completed:
// ! 图片加载完成,这里我进行压缩
_controller.forward();
if (_imageFileB != null) {
return ExtendedImage.memory(
_imageFileB,
width: widget.width,
height: widget.height,
fit: widget.fit,
);
} else {
return CupertinoActivityIndicator(radius: Common.width(24));
}
// ui.Image image = state.extendedImageInfo?.image;
// return ExtendedRawImage(
// image: state.extendedImageInfo?.image,
// width: widget.width,
// height: widget.height,
// sourceRect: Rect.fromLTWH(0.0, 0.0, image.height.toDouble(),
// image.height.toDouble()),
// );
break;
case LoadState.failed:
_controller.reset();
// remove memory cached
state.imageProvider.evict();
return Stack(
fit: StackFit.expand,
children: <Widget>[
Image.asset(
'asset/icon/loading.gif',
fit: BoxFit.fill,
),
],
);
break;
}
return Container();
},
));
}
}