Skip to content

Commit fb875e9

Browse files
authored
feat: Add getSizeResult (#42)
Signed-off-by: Caijinglong <[email protected]>
1 parent ef9d71e commit fb875e9

File tree

10 files changed

+187
-36
lines changed

10 files changed

+187
-36
lines changed

example/bin/main.dart

+14-10
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,24 @@ import 'package:image_size_getter/file_input.dart';
55

66
void main(List<String> arguments) async {
77
final file = File('asset/IMG_20180908_080245.jpg');
8-
final size = ImageSizeGetter.getSize(FileInput(file));
9-
print('jpg = $size');
8+
final jpgResult = ImageSizeGetter.getSizeResult(FileInput(file));
9+
print(
10+
'jpg = ${jpgResult.size} (decoded by ${jpgResult.decoder.decoderName})');
1011

1112
final pngFile = File('asset/ic_launcher.png');
12-
final pngSize = ImageSizeGetter.getSize(FileInput(pngFile));
13-
print('png = $pngSize');
13+
final pngResult = ImageSizeGetter.getSizeResult(FileInput(pngFile));
14+
print(
15+
'png = ${pngResult.size} (decoded by ${pngResult.decoder.decoderName})');
1416

1517
final webpFile = File('asset/demo.webp');
16-
final webpSize = ImageSizeGetter.getSize(FileInput(webpFile));
17-
print('webp = $webpSize');
18+
final webpResult = ImageSizeGetter.getSizeResult(FileInput(webpFile));
19+
print(
20+
'webp = ${webpResult.size} (decoded by ${webpResult.decoder.decoderName})');
1821

1922
final gifFile = File('asset/dialog.gif');
20-
final gifSize = ImageSizeGetter.getSize(FileInput(gifFile));
21-
print('gif = $gifSize');
23+
final gifResult = ImageSizeGetter.getSizeResult(FileInput(gifFile));
24+
print(
25+
'gif = ${gifResult.size} (decoded by ${gifResult.decoder.decoderName})');
2226

2327
// errorExample();
2428
}
@@ -27,6 +31,6 @@ void errorExample() {
2731
final input = FileInput(File(
2832
'/Users/jinglongcai/Desktop/96068243-1d25cb00-0ece-11eb-9f2c-6b958756c769.jpg'));
2933

30-
final size = ImageSizeGetter.getSize(input);
31-
print(size);
34+
final result = ImageSizeGetter.getSizeResult(input);
35+
print('${result.size} (decoded by ${result.decoder.decoderName})');
3236
}

example/test/issue_027_test.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ void main() {
3434
final isJpg = MyJpegDecoder().isValid(fileInput);
3535
expect(isJpg, true);
3636

37-
print('jpg size: ${ImageSizeGetter.getSize(fileInput)}');
37+
final result = ImageSizeGetter.getSizeResult(fileInput);
38+
print(
39+
'jpg size: ${result.size} (decoded by ${result.decoder.decoderName})');
3840
}
3941
}
4042
});

packages/image_size_getter/CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# CHANGELOG
22

33
- [CHANGELOG](#changelog)
4+
- [2.3.0](#230)
45
- [2.2.0](#220)
56
- [2.1.3](#213)
67
- [2.1.2](#212)
@@ -15,6 +16,12 @@
1516
- [0.1.1](#011)
1617
- [0.1.0](#010)
1718

19+
## 2.3.0
20+
21+
Feature:
22+
23+
- Add `getSizeResult` for `SizeResult`
24+
1825
## 2.2.0
1926

2027
Feature:

packages/image_size_getter/README.md

+30-17
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,30 @@ Just support jpeg, gif, png, webp, bmp.
1212
import 'dart:io';
1313
1414
import 'package:image_size_getter/image_size_getter.dart';
15-
import 'package:image_size_getter/file_input.dart'; // For compatibility with flutter web.
15+
import 'package:image_size_getter/file_input.dart';
1616
1717
void main(List<String> arguments) async {
1818
final file = File('asset/IMG_20180908_080245.jpg');
19-
final size = ImageSizeGetter.getSize(FileInput(file));
20-
print('jpg = $size');
19+
final jpgResult = ImageSizeGetter.getSizeResult(FileInput(file));
20+
print(
21+
'jpg = ${jpgResult.size} (decoded by ${jpgResult.decoder.decoderName})');
2122
2223
final pngFile = File('asset/ic_launcher.png');
23-
final pngSize = ImageSizeGetter.getSize(FileInput(pngFile));
24-
print('png = $pngSize');
24+
final pngResult = ImageSizeGetter.getSizeResult(FileInput(pngFile));
25+
print(
26+
'png = ${pngResult.size} (decoded by ${pngResult.decoder.decoderName})');
2527
2628
final webpFile = File('asset/demo.webp');
27-
final webpSize = ImageSizeGetter.getSize(FileInput(webpFile));
28-
print('webp = $webpSize');
29+
final webpResult = ImageSizeGetter.getSizeResult(FileInput(webpFile));
30+
print(
31+
'webp = ${webpResult.size} (decoded by ${webpResult.decoder.decoderName})');
2932
3033
final gifFile = File('asset/dialog.gif');
31-
final gifSize = ImageSizeGetter.getSize(FileInput(gifFile));
32-
print('gif = $gifSize');
34+
final gifResult = ImageSizeGetter.getSizeResult(FileInput(gifFile));
35+
print(
36+
'gif = ${gifResult.size} (decoded by ${gifResult.decoder.decoderName})');
37+
38+
// errorExample();
3339
}
3440
3541
```
@@ -40,8 +46,10 @@ void main(List<String> arguments) async {
4046
import 'package:image_size_getter/image_size_getter.dart';
4147
4248
void foo(Uint8List image){
43-
final memoryImageSize = ImageSizeGetter.getSize(MemoryInput(image));
44-
print('memoryImageSize = $memoryImageSize');
49+
final memoryImageSizeResult = ImageSizeGetter.getSizeResult(MemoryInput(image));
50+
final size = memoryImageSizeResult.size;
51+
final decoder = memoryImageSizeResult.decoder;
52+
print('size = $size, decoder = ${decoder.decoderName}');
4553
}
4654
```
4755

@@ -60,14 +68,16 @@ We can use next code to get width and height.
6068

6169
```dart
6270
void foo(File file) {
63-
final size = ImageSizeGetter.getSize(FileInput(file));
71+
final sizeResult = ImageSizeGetter.getSizeResult(FileInput(file));
72+
final size = sizeResult.size;
6473
if (size.needRotate) {
6574
final width = size.height;
6675
final height = size.width;
6776
print('width = $width, height = $height');
6877
} else {
6978
print('width = ${size.width}, height = ${size.height}');
7079
}
80+
print('decoder = ${sizeResult.decoder.decoderName}');
7181
}
7282
```
7383

@@ -160,7 +170,7 @@ const BmpDecoder decoder = BmpDecoder();
160170
final input = FileInput(bmp);
161171
162172
assert(decoder.isValid(input));
163-
expect(decoder.getSize(input), Size(256, 256));
173+
expect(decoder.getSizeResult(input).size, Size(256, 256));
164174
```
165175

166176
#### Register custom decoder to image size getter
@@ -188,7 +198,8 @@ void decodeWithImageInput(ImageInput input) {
188198
print('isGif: $isGif');
189199
190200
if (isGif) {
191-
final size = decoder.getSize(input);
201+
final sizeResult = decoder.getSizeResult(input);
202+
final size = sizeResult.size;
192203
print('size: $size');
193204
}
194205
}
@@ -199,7 +210,8 @@ void decodeWithAsyncImageInput(AsyncImageInput input) async {
199210
print('isPng: $isPng');
200211
201212
if (isPng) {
202-
final size = await decoder.getSizeAsync(input);
213+
final sizeResult = await decoder.getSizeResultAsync(input);
214+
final size = sizeResult.size;
203215
print('size: $size');
204216
}
205217
}
@@ -216,8 +228,9 @@ So, if you want to get flutter asset image size, you must convert it to memory(U
216228

217229
```dart
218230
final buffer = await rootBundle.load('assets/logo.png'); // get the byte buffer
219-
final memoryImageSize = ImageSizeGetter.getSize(MemoryInput.byteBuffer(buffer));
220-
print('memoryImageSize = $memoryImageSize');
231+
final memoryImageSizeResult = ImageSizeGetter.getSizeResult(MemoryInput.byteBuffer(buffer));
232+
final size = memoryImageSizeResult.size;
233+
print('size = $size');
221234
```
222235

223236
## LICENSE

packages/image_size_getter/lib/src/entity/size.dart

+27
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:hashcodes/hashcodes.dart';
22

3+
import '../../image_size_getter.dart';
4+
35
/// {@template image_size_getter.Size}
46
///
57
/// [Size] is a class for image size.
@@ -65,3 +67,28 @@ class Size {
6567
@override
6668
int get hashCode => hashValues(width, height);
6769
}
70+
71+
/// {@template image_size_getter.SizeResult}
72+
///
73+
/// [SizeResult] is a class for image size result.
74+
///
75+
/// The result contains [size] and [decoder].
76+
///
77+
/// {@endtemplate}
78+
class SizeResult {
79+
/// {@macro image_size_getter.SizeResult}
80+
const SizeResult({
81+
required this.size,
82+
required this.decoder,
83+
});
84+
85+
/// The size of the media.
86+
///
87+
/// See [Size].
88+
final Size size;
89+
90+
/// The decoder of the media.
91+
///
92+
/// See [BaseDecoder].
93+
final BaseDecoder decoder;
94+
}

packages/image_size_getter/lib/src/image_size_getter.dart

+50
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ class ImageSizeGetter {
110110
/// If the [input] is not a valid image format, it will throw [UnsupportedError].
111111
///
112112
/// {@endtemplate}
113+
@Deprecated(
114+
'Use getSizeResult instead. This method will be removed in the next major version.')
113115
static Size getSize(ImageInput input) {
114116
if (!input.exists()) {
115117
throw StateError('The input is not exists.');
@@ -127,6 +129,8 @@ class ImageSizeGetter {
127129
/// {@macro image_size_getter.getSize}
128130
///
129131
/// The method is async.
132+
@Deprecated(
133+
'Use getSizeResultAsync instead. This method will be removed in the next major version.')
130134
static Future<Size> getSizeAsync(AsyncImageInput input) async {
131135
if (!await input.exists()) {
132136
throw StateError('The input is not exists.');
@@ -149,4 +153,50 @@ class ImageSizeGetter {
149153

150154
throw UnsupportedError('The input is not supported.');
151155
}
156+
157+
/// {@template image_size_getter.getSizeResult}
158+
/// Get the size of the [input] and the [BaseDecoder] that decodes the [input].
159+
/// {@endtemplate}
160+
static SizeResult getSizeResult(ImageInput input) {
161+
if (!input.exists()) {
162+
throw StateError('The input is not exists.');
163+
}
164+
165+
for (var value in _decoders) {
166+
if (value.isValid(input)) {
167+
return SizeResult(size: value.getSize(input), decoder: value);
168+
}
169+
}
170+
171+
throw UnsupportedError('The input is not supported.');
172+
}
173+
174+
/// {@macro image_size_getter.getSizeResult}
175+
///
176+
/// The method is async version for [getSizeResult].
177+
static Future<SizeResult> getSizeResultAsync(AsyncImageInput input) async {
178+
if (!await input.exists()) {
179+
throw StateError('The input is not exists.');
180+
}
181+
182+
if (!(await input.supportRangeLoad())) {
183+
final delegateInput = await input.delegateInput();
184+
try {
185+
return ImageSizeGetter.getSizeResult(delegateInput);
186+
} finally {
187+
delegateInput.release();
188+
}
189+
}
190+
191+
for (var value in _decoders) {
192+
if (await value.isValidAsync(input)) {
193+
return SizeResult(
194+
size: await value.getSizeAsync(input),
195+
decoder: value,
196+
);
197+
}
198+
}
199+
200+
throw UnsupportedError('The input is not supported.');
201+
}
152202
}

packages/image_size_getter/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: image_size_getter
22
description: Get image width and height, the library does not completely decode the image file, just read the metadata to get the image width and height.
3-
version: 2.2.0
3+
version: 2.3.0
44
homepage: https://github.com/CaiJingLong/dart_image_size_getter
55
# publish_to: https://pub.dev
66

0 commit comments

Comments
 (0)