Skip to content

Commit

Permalink
feat: Add getSizeResult (#42)
Browse files Browse the repository at this point in the history
Signed-off-by: Caijinglong <cjl_spy@163.com>
  • Loading branch information
CaiJingLong authored Jan 6, 2025
1 parent ef9d71e commit fb875e9
Show file tree
Hide file tree
Showing 10 changed files with 187 additions and 36 deletions.
24 changes: 14 additions & 10 deletions example/bin/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,24 @@ import 'package:image_size_getter/file_input.dart';

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

final pngFile = File('asset/ic_launcher.png');
final pngSize = ImageSizeGetter.getSize(FileInput(pngFile));
print('png = $pngSize');
final pngResult = ImageSizeGetter.getSizeResult(FileInput(pngFile));
print(
'png = ${pngResult.size} (decoded by ${pngResult.decoder.decoderName})');

final webpFile = File('asset/demo.webp');
final webpSize = ImageSizeGetter.getSize(FileInput(webpFile));
print('webp = $webpSize');
final webpResult = ImageSizeGetter.getSizeResult(FileInput(webpFile));
print(
'webp = ${webpResult.size} (decoded by ${webpResult.decoder.decoderName})');

final gifFile = File('asset/dialog.gif');
final gifSize = ImageSizeGetter.getSize(FileInput(gifFile));
print('gif = $gifSize');
final gifResult = ImageSizeGetter.getSizeResult(FileInput(gifFile));
print(
'gif = ${gifResult.size} (decoded by ${gifResult.decoder.decoderName})');

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

final size = ImageSizeGetter.getSize(input);
print(size);
final result = ImageSizeGetter.getSizeResult(input);
print('${result.size} (decoded by ${result.decoder.decoderName})');
}
4 changes: 3 additions & 1 deletion example/test/issue_027_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ void main() {
final isJpg = MyJpegDecoder().isValid(fileInput);
expect(isJpg, true);

print('jpg size: ${ImageSizeGetter.getSize(fileInput)}');
final result = ImageSizeGetter.getSizeResult(fileInput);
print(
'jpg size: ${result.size} (decoded by ${result.decoder.decoderName})');
}
}
});
Expand Down
7 changes: 7 additions & 0 deletions packages/image_size_getter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# CHANGELOG

- [CHANGELOG](#changelog)
- [2.3.0](#230)
- [2.2.0](#220)
- [2.1.3](#213)
- [2.1.2](#212)
Expand All @@ -15,6 +16,12 @@
- [0.1.1](#011)
- [0.1.0](#010)

## 2.3.0

Feature:

- Add `getSizeResult` for `SizeResult`

## 2.2.0

Feature:
Expand Down
47 changes: 30 additions & 17 deletions packages/image_size_getter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,30 @@ Just support jpeg, gif, png, webp, bmp.
import 'dart:io';
import 'package:image_size_getter/image_size_getter.dart';
import 'package:image_size_getter/file_input.dart'; // For compatibility with flutter web.
import 'package:image_size_getter/file_input.dart';
void main(List<String> arguments) async {
final file = File('asset/IMG_20180908_080245.jpg');
final size = ImageSizeGetter.getSize(FileInput(file));
print('jpg = $size');
final jpgResult = ImageSizeGetter.getSizeResult(FileInput(file));
print(
'jpg = ${jpgResult.size} (decoded by ${jpgResult.decoder.decoderName})');
final pngFile = File('asset/ic_launcher.png');
final pngSize = ImageSizeGetter.getSize(FileInput(pngFile));
print('png = $pngSize');
final pngResult = ImageSizeGetter.getSizeResult(FileInput(pngFile));
print(
'png = ${pngResult.size} (decoded by ${pngResult.decoder.decoderName})');
final webpFile = File('asset/demo.webp');
final webpSize = ImageSizeGetter.getSize(FileInput(webpFile));
print('webp = $webpSize');
final webpResult = ImageSizeGetter.getSizeResult(FileInput(webpFile));
print(
'webp = ${webpResult.size} (decoded by ${webpResult.decoder.decoderName})');
final gifFile = File('asset/dialog.gif');
final gifSize = ImageSizeGetter.getSize(FileInput(gifFile));
print('gif = $gifSize');
final gifResult = ImageSizeGetter.getSizeResult(FileInput(gifFile));
print(
'gif = ${gifResult.size} (decoded by ${gifResult.decoder.decoderName})');
// errorExample();
}
```
Expand All @@ -40,8 +46,10 @@ void main(List<String> arguments) async {
import 'package:image_size_getter/image_size_getter.dart';
void foo(Uint8List image){
final memoryImageSize = ImageSizeGetter.getSize(MemoryInput(image));
print('memoryImageSize = $memoryImageSize');
final memoryImageSizeResult = ImageSizeGetter.getSizeResult(MemoryInput(image));
final size = memoryImageSizeResult.size;
final decoder = memoryImageSizeResult.decoder;
print('size = $size, decoder = ${decoder.decoderName}');
}
```

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

```dart
void foo(File file) {
final size = ImageSizeGetter.getSize(FileInput(file));
final sizeResult = ImageSizeGetter.getSizeResult(FileInput(file));
final size = sizeResult.size;
if (size.needRotate) {
final width = size.height;
final height = size.width;
print('width = $width, height = $height');
} else {
print('width = ${size.width}, height = ${size.height}');
}
print('decoder = ${sizeResult.decoder.decoderName}');
}
```

Expand Down Expand Up @@ -160,7 +170,7 @@ const BmpDecoder decoder = BmpDecoder();
final input = FileInput(bmp);
assert(decoder.isValid(input));
expect(decoder.getSize(input), Size(256, 256));
expect(decoder.getSizeResult(input).size, Size(256, 256));
```

#### Register custom decoder to image size getter
Expand Down Expand Up @@ -188,7 +198,8 @@ void decodeWithImageInput(ImageInput input) {
print('isGif: $isGif');
if (isGif) {
final size = decoder.getSize(input);
final sizeResult = decoder.getSizeResult(input);
final size = sizeResult.size;
print('size: $size');
}
}
Expand All @@ -199,7 +210,8 @@ void decodeWithAsyncImageInput(AsyncImageInput input) async {
print('isPng: $isPng');
if (isPng) {
final size = await decoder.getSizeAsync(input);
final sizeResult = await decoder.getSizeResultAsync(input);
final size = sizeResult.size;
print('size: $size');
}
}
Expand All @@ -216,8 +228,9 @@ So, if you want to get flutter asset image size, you must convert it to memory(U

```dart
final buffer = await rootBundle.load('assets/logo.png'); // get the byte buffer
final memoryImageSize = ImageSizeGetter.getSize(MemoryInput.byteBuffer(buffer));
print('memoryImageSize = $memoryImageSize');
final memoryImageSizeResult = ImageSizeGetter.getSizeResult(MemoryInput.byteBuffer(buffer));
final size = memoryImageSizeResult.size;
print('size = $size');
```

## LICENSE
Expand Down
27 changes: 27 additions & 0 deletions packages/image_size_getter/lib/src/entity/size.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:hashcodes/hashcodes.dart';

import '../../image_size_getter.dart';

/// {@template image_size_getter.Size}
///
/// [Size] is a class for image size.
Expand Down Expand Up @@ -65,3 +67,28 @@ class Size {
@override
int get hashCode => hashValues(width, height);
}

/// {@template image_size_getter.SizeResult}
///
/// [SizeResult] is a class for image size result.
///
/// The result contains [size] and [decoder].
///
/// {@endtemplate}
class SizeResult {
/// {@macro image_size_getter.SizeResult}
const SizeResult({
required this.size,
required this.decoder,
});

/// The size of the media.
///
/// See [Size].
final Size size;

/// The decoder of the media.
///
/// See [BaseDecoder].
final BaseDecoder decoder;
}
50 changes: 50 additions & 0 deletions packages/image_size_getter/lib/src/image_size_getter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ class ImageSizeGetter {
/// If the [input] is not a valid image format, it will throw [UnsupportedError].
///
/// {@endtemplate}
@Deprecated(
'Use getSizeResult instead. This method will be removed in the next major version.')
static Size getSize(ImageInput input) {
if (!input.exists()) {
throw StateError('The input is not exists.');
Expand All @@ -127,6 +129,8 @@ class ImageSizeGetter {
/// {@macro image_size_getter.getSize}
///
/// The method is async.
@Deprecated(
'Use getSizeResultAsync instead. This method will be removed in the next major version.')
static Future<Size> getSizeAsync(AsyncImageInput input) async {
if (!await input.exists()) {
throw StateError('The input is not exists.');
Expand All @@ -149,4 +153,50 @@ class ImageSizeGetter {

throw UnsupportedError('The input is not supported.');
}

/// {@template image_size_getter.getSizeResult}
/// Get the size of the [input] and the [BaseDecoder] that decodes the [input].
/// {@endtemplate}
static SizeResult getSizeResult(ImageInput input) {
if (!input.exists()) {
throw StateError('The input is not exists.');
}

for (var value in _decoders) {
if (value.isValid(input)) {
return SizeResult(size: value.getSize(input), decoder: value);
}
}

throw UnsupportedError('The input is not supported.');
}

/// {@macro image_size_getter.getSizeResult}
///
/// The method is async version for [getSizeResult].
static Future<SizeResult> getSizeResultAsync(AsyncImageInput input) async {
if (!await input.exists()) {
throw StateError('The input is not exists.');
}

if (!(await input.supportRangeLoad())) {
final delegateInput = await input.delegateInput();
try {
return ImageSizeGetter.getSizeResult(delegateInput);
} finally {
delegateInput.release();
}
}

for (var value in _decoders) {
if (await value.isValidAsync(input)) {
return SizeResult(
size: await value.getSizeAsync(input),
decoder: value,
);
}
}

throw UnsupportedError('The input is not supported.');
}
}
2 changes: 1 addition & 1 deletion packages/image_size_getter/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: image_size_getter
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.
version: 2.2.0
version: 2.3.0
homepage: https://github.com/CaiJingLong/dart_image_size_getter
# publish_to: https://pub.dev

Expand Down
Loading

0 comments on commit fb875e9

Please sign in to comment.