1+ import 'dart:async' ;
12import 'dart:math' ;
2- import 'dart:typed_data' ;
3+ import 'dart:ui' as ui ;
34
5+ import 'package:file/file.dart' ;
6+ import 'package:flutter/widgets.dart' ;
47import 'package:flutter_cache_manager/flutter_cache_manager.dart' ;
5- import 'package:image/image.dart' ;
68
79const supportedFileNames = ['jpg' , 'jpeg' , 'png' , 'tga' , 'gif' , 'cur' , 'ico' ];
810mixin ImageCacheManager on BaseCacheManager {
@@ -60,6 +62,7 @@ mixin ImageCacheManager on BaseCacheManager {
6062 }
6163
6264 final Map <String , Stream <FileResponse >> _runningResizes = {};
65+
6366 Future <FileInfo > _resizeImageFile (
6467 FileInfo originalFile,
6568 String key,
@@ -72,7 +75,14 @@ mixin ImageCacheManager on BaseCacheManager {
7275 return originalFile;
7376 }
7477
75- var image = decodeImage (await originalFile.file.readAsBytes ())! ;
78+ var image = await _decodeImage (originalFile.file);
79+
80+ var shouldResize = maxWidth != null
81+ ? image.width > maxWidth
82+ : false || maxHeight != null
83+ ? image.height > maxHeight
84+ : false ;
85+ if (! shouldResize) return originalFile;
7686 if (maxWidth != null && maxHeight != null ) {
7787 var resizeFactorWidth = image.width / maxWidth;
7888 var resizeFactorHeight = image.height / maxHeight;
@@ -82,13 +92,17 @@ mixin ImageCacheManager on BaseCacheManager {
8292 maxHeight = (image.height / resizeFactor).round ();
8393 }
8494
85- var resized = copyResize (image, width: maxWidth, height: maxHeight);
86- var resizedFile = encodeNamedImage (resized, originalFileName)! ;
95+ var resized = await _decodeImage (originalFile.file,
96+ width: maxWidth, height: maxHeight, allowUpscaling: false );
97+ var resizedFile =
98+ (await resized.toByteData (format: ui.ImageByteFormat .png))!
99+ .buffer
100+ .asUint8List ();
87101 var maxAge = originalFile.validTill.difference (DateTime .now ());
88102
89103 var file = await putFile (
90104 originalFile.originalUrl,
91- Uint8List . fromList ( resizedFile) ,
105+ resizedFile,
92106 key: key,
93107 maxAge: maxAge,
94108 fileExtension: fileExtension,
@@ -131,3 +145,21 @@ mixin ImageCacheManager on BaseCacheManager {
131145 }
132146 }
133147}
148+
149+ Future <ui.Image > _decodeImage (File file,
150+ {int ? width, int ? height, bool allowUpscaling = false }) {
151+ var shouldResize = width != null || height != null ;
152+ var fileImage = FileImage (file);
153+ final image = shouldResize
154+ ? ResizeImage (fileImage,
155+ width: width, height: height, allowUpscaling: allowUpscaling)
156+ : fileImage as ImageProvider ;
157+ final completer = Completer <ui.Image >();
158+ image
159+ .resolve (const ImageConfiguration ())
160+ .addListener (ImageStreamListener ((info, _) {
161+ completer.complete (info.image);
162+ image.evict ();
163+ }));
164+ return completer.future;
165+ }
0 commit comments