image_size_getter
2.4.1Get image width and height, the library does not completely decode the image file, just read the metadata to get the image width and height.
Readme
image_size_getter
pub package likes popularity pub points
GitHub stars GitHub forks GitHub license
Do not completely decode the image file, just read the metadata to get the image width and height.
Just support jpeg, gif, png, webp, bmp.
Install
dependencies:
image_size_getter: ^2.3.0
Usage
Image of File
import 'dart:io';
import 'package:image_size_getter/image_size_getter.dart';
import 'package:image_size_getter/file_input.dart';
void main(List<String> arguments) async {
final file = File('asset/IMG_20180908_080245.jpg');
final jpgResult = ImageSizeGetter.getSizeResult(FileInput(file));
print(
'jpg = ${jpgResult.size} (decoded by ${jpgResult.decoder.decoderName})');
final pngFile = File('asset/ic_launcher.png');
final pngResult = ImageSizeGetter.getSizeResult(FileInput(pngFile));
print(
'png = ${pngResult.size} (decoded by ${pngResult.decoder.decoderName})');
final webpFile = File('asset/demo.webp');
final webpResult = ImageSizeGetter.getSizeResult(FileInput(webpFile));
print(
'webp = ${webpResult.size} (decoded by ${webpResult.decoder.decoderName})');
final gifFile = File('asset/dialog.gif');
final gifResult = ImageSizeGetter.getSizeResult(FileInput(gifFile));
print(
'gif = ${gifResult.size} (decoded by ${gifResult.decoder.decoderName})');
// errorExample();
}
Image of Memory
import 'package:image_size_getter/image_size_getter.dart';
void foo(Uint8List image){
final memoryImageSizeResult = ImageSizeGetter.getSizeResult(MemoryInput(image));
final size = memoryImageSizeResult.size;
final decoder = memoryImageSizeResult.decoder;
print('size = $size, decoder = ${decoder.decoderName}');
}
Image of Http
See HttpInput.
About Size
The size contains width and height.
But some image have orientation. Such as jpeg, when the orientation of exif is 5, 6, 7 or 8, the width and height will be swapped.
We can use next code to get width and height.
void foo(File 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}');
}
AsyncImageInput
If your data source is read asynchronously, consider using AsyncImageInput.
A typical use case is http_input.
Check the extension for decoder
Since 2.4.0
void checkExtension(String ext, BaseDecoder decoder) {
final isSupport = decoder.isExtensionSupported(ext);
print('The decoder ${decoder.decoderName} support $ext: $isSupport');
}
Custom
We can implement our own input or decoder.
In addition to several built-in implementations, subsequent implementations will also be added to the project through plugin.
Custom Input
Such as: http_input.
In addition, if your picture has verification, for example, you need to use the request header to access it, or you need a post request to get it, you need to customize input.
Custom Decoder
Such as bmp decoder
Check the file type:
VPMMfA
The width and height:
AZnx9I
So, we can write code with:
import 'package:image_size_getter/image_size_getter.dart';
class BmpDecoder extends BaseDecoder {
const BmpDecoder();
@override
String get decoderName => 'bmp';
@override
Size getSize(ImageInput input) {
final widthList = input.getRange(0x12, 0x16);
final heightList = input.getRange(0x16, 0x1a);
final width = convertRadix16ToInt(widthList, reverse: true);
final height = convertRadix16ToInt(heightList, reverse: true);
return Size(width, height);
}
@override
Future<Size> getSizeAsync(AsyncImageInput input) async {
final widthList = await input.getRange(0x12, 0x16);
final heightList = await input.getRange(0x16, 0x1a);
final width = convertRadix16ToInt(widthList, reverse: true);
final height = convertRadix16ToInt(heightList, reverse: true);
return Size(width, height);
}
@override
bool isValid(ImageInput input) {
final list = input.getRange(0, 2);
return _isBmp(list);
}
@override
Future<bool> isValidAsync(AsyncImageInput input) async {
final list = await input.getRange(0, 2);
return _isBmp(list);
}
bool _isBmp(List<int> startList) {
return startList[0] == 66 && startList[1] == 77;
}
}
Use it:
final bmp = File('../../example/asset/demo.bmp');
const BmpDecoder decoder = BmpDecoder();
final input = FileInput(bmp);
assert(decoder.isValid(input));
expect(decoder.getSizeResult(input).size, Size(256, 256));
Register custom decoder to image size getter
ImageSizeGetter.registerDecoder(const BmpDecoder());
The method can also be used to replace the default decoder.
For example, you think the existing JPEG format is not rigorous enough.
ImageSizeGetter.registerDecoder(const MyJpegDecoder());
Use decoder alone
Each decoder can be used alone.
void decodeWithImageInput(ImageInput input) {
BaseDecoder decoder = const GifDecoder();
final isGif = decoder.isValid(input);
print('isGif: $isGif');
if (isGif) {
final sizeResult = decoder.getSizeResult(input);
final size = sizeResult.size;
print('size: $size');
}
}
void decodeWithAsyncImageInput(AsyncImageInput input) async {
BaseDecoder decoder = const PngDecoder();
final isPng = await decoder.isValidAsync(input);
print('isPng: $isPng');
if (isPng) {
final sizeResult = await decoder.getSizeResultAsync(input);
final size = sizeResult.size;
print('size: $size');
}
}
migrate
See migrate
Other question
The package is dart package, no just flutter package. So, if you want to get flutter asset image size, you must convert it to memory(Uint8List).
final buffer = await rootBundle.load('assets/logo.png'); // get the byte buffer
final memoryImageSizeResult = ImageSizeGetter.getSizeResult(MemoryInput.byteBuffer(buffer));
final size = memoryImageSizeResult.size;
print('size = $size');
LICENSE
Apache 2.0
Changelog
CHANGELOG
2.4.1
- Fix: Corrected orientation retrieval in JPEG images.
2.4.0
- Add
isExtensionSupportedtoBaseDecoder
2.3.0+1
- Docs: Add docs for dartdoc.
2.3.0
Feature:
- Add
getSizeResultforSizeResult
2.2.0
Feature:
- Add non-standard jpeg decoder
2.1.3
Fix:
- Support lossless WebP (#38)
2.1.2
Fix:
- Support gif 87a type [#23] [#24].
2.1.1
- fix: remove debug value print calls from
jpeg_decoderby @ZaLiTHkA in https://github.com/CaiJingLong/dart_image_size_getter/pull/21 - @ZaLiTHkA made their first contribution in https://github.com/CaiJingLong/dart_image_size_getter/pull/21
Full Changelog: https://github.com/CaiJingLong/dart_image_size_getter/compare/library-2.1.0...library-2.1.1
2.1.0
Feature:
- Add
needRotateforSize
What's Changed: - Add needRotate for Size by @CaiJingLong in https://github.com/CaiJingLong/dart_image_size_getter/pull/20
Full Changelog: https://github.com/CaiJingLong/dart_image_size_getter/compare/http_input-2.0.0...library-2.1.0
2.0.0
New feature:
- Refactored the code and removed the
AsyncImageSizeGetterclass. - We can customize the decoder.
1.1.0
- Support webp extended format by @nkming2 in https://github.com/CaiJingLong/dart_image_size_getter/pull/11
- Http input by @CaiJingLong in https://github.com/CaiJingLong/dart_image_size_getter/pull/14
New Contributors: - @nkming2 made their first contribution in https://github.com/CaiJingLong/dart_image_size_getter/pull/11
Full Changelog: https://github.com/CaiJingLong/dart_image_size_getter/compare/1.0.0...1.1.0
1.0.0
Null safety version.
0.3.0
Support get size of async input of image.
0.2.1
Update dependency. Fix readme.
0.2.0
Support memory type.
Breaking change:
Fix: type of ImageSizeGetter
0.1.1
FIx jpeg format.
0.1.0
Initial version.
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add image_size_getterpubspec.yaml
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.4.1
homepage: https://github.com/CaiJingLong/dart_image_size_getter
topics:
- image
- metadata
- size
- performance
environment:
sdk: ">=2.12.0 <4.0.0"
dependencies:
collection: ^1.15.0
hashcodes: ^2.0.0
meta: ^1.9.0
dev_dependencies:
pedantic: ^1.11.0
test: ^1.16.8
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 0.1.0 | On demand | Download | 86c761b0…cbab4e |
| 0.1.1 | On demand | Download | a8f3c51b…14722a |
| 0.2.0 | On demand | Download | f15e9fff…e2c417 |
| 0.2.1 | On demand | Download | 4f15c477…3ef8d9 |
| 0.3.0 | On demand | Download | b1641da8…e11684 |
| 1.0.0 | On demand | Download | de04ae2e…371bff |
| 1.1.0 | On demand | Download | 414ebd27…d75320 |
| 2.0.0 | On demand | Download | 650a1eb4…9c4f23 |
| 2.1.0 | On demand | Download | 20da7a09…866065 |
| 2.1.1 | On demand | Download | 84743b98…82f87f |
| 2.1.2 | On demand | Download | 75befb50…c052e0 |
| 2.1.3 | On demand | Download | f98c4246…490e57 |
| 2.2.0 | On demand | Download | 05117994…db12b0 |
| 2.3.0 | On demand | Download | c769a86b…3c82fe |
| 2.3.0+1 | On demand | Download | c3900f04…e24c05 |
| 2.4.0 | On demand | Download | 9a299e3a…f35653 |
| 2.4.1 | Cached · Upstream SHA-256 matched | Download | 7c26937e…3e590f |
Dependencies
collection "^1.15.0"
hashcodes "^2.0.0"
meta "^1.9.0"