diff --git a/example/asset/demo_extended.webp b/example/asset/demo_extended.webp new file mode 100644 index 0000000..f8a83a1 Binary files /dev/null and b/example/asset/demo_extended.webp differ diff --git a/library/lib/src/decoder/async/decoder.dart b/library/lib/src/decoder/async/decoder.dart index 2719524..bb81ef6 100644 --- a/library/lib/src/decoder/async/decoder.dart +++ b/library/lib/src/decoder/async/decoder.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:image_size_getter/src/core/size.dart'; import 'package:image_size_getter/src/entity/block_entity.dart'; diff --git a/library/lib/src/decoder/async/webp_decoder.dart b/library/lib/src/decoder/async/webp_decoder.dart index e94a676..10b5099 100644 --- a/library/lib/src/decoder/async/webp_decoder.dart +++ b/library/lib/src/decoder/async/webp_decoder.dart @@ -5,15 +5,28 @@ class WebpDecoder extends AsyncImageDecoder { @override Future get size async { - final widthList = await input.getRange(0x1a, 0x1c); - final heightList = await input.getRange(0x1c, 0x1e); - final width = convertRadix16ToInt(widthList, reverse: true); - final height = convertRadix16ToInt(heightList, reverse: true); - return Size(width, height); + if (await _isExtendedFormat()) { + final widthList = await input.getRange(0x18, 0x1b); + final heightList = await input.getRange(0x1b, 0x1d); + final width = convertRadix16ToInt(widthList, reverse: true) + 1; + final height = convertRadix16ToInt(heightList, reverse: true) + 1; + return Size(width, height); + } else { + final widthList = await input.getRange(0x1a, 0x1c); + final heightList = await input.getRange(0x1c, 0x1e); + final width = convertRadix16ToInt(widthList, reverse: true); + final height = convertRadix16ToInt(heightList, reverse: true); + return Size(width, height); + } } Future isLossy() async { final v8Tag = await input.getRange(12, 16); return v8Tag[3] == 0x20; } + + Future _isExtendedFormat() async { + final chunkHeader = await input.getRange(12, 16); + return ListEquality().equals(chunkHeader, "VP8X".codeUnits); + } } diff --git a/library/lib/src/decoder/sync/decoder.dart b/library/lib/src/decoder/sync/decoder.dart index caba1b3..617ba27 100644 --- a/library/lib/src/decoder/sync/decoder.dart +++ b/library/lib/src/decoder/sync/decoder.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:image_size_getter/src/core/size.dart'; import 'package:image_size_getter/src/entity/block_entity.dart'; diff --git a/library/lib/src/decoder/sync/webp_decoder.dart b/library/lib/src/decoder/sync/webp_decoder.dart index 8a7cbce..311b619 100644 --- a/library/lib/src/decoder/sync/webp_decoder.dart +++ b/library/lib/src/decoder/sync/webp_decoder.dart @@ -7,15 +7,28 @@ class WebpDecoder extends ImageDecoder { @override Size get size { - final widthList = input.getRange(0x1a, 0x1c); - final heightList = input.getRange(0x1c, 0x1e); - final width = convertRadix16ToInt(widthList, reverse: true); - final height = convertRadix16ToInt(heightList, reverse: true); - return Size(width, height); + if (_isExtendedFormat()) { + final widthList = input.getRange(0x18, 0x1b); + final heightList = input.getRange(0x1b, 0x1d); + final width = convertRadix16ToInt(widthList, reverse: true) + 1; + final height = convertRadix16ToInt(heightList, reverse: true) + 1; + return Size(width, height); + } else { + final widthList = input.getRange(0x1a, 0x1c); + final heightList = input.getRange(0x1c, 0x1e); + final width = convertRadix16ToInt(widthList, reverse: true); + final height = convertRadix16ToInt(heightList, reverse: true); + return Size(width, height); + } } Future isLossy() async { final v8Tag = input.getRange(12, 16); return v8Tag[3] == 0x20; } + + bool _isExtendedFormat() { + final chunkHeader = input.getRange(12, 16); + return ListEquality().equals(chunkHeader, "VP8X".codeUnits); + } } diff --git a/library/test/image_size_getter_test.dart b/library/test/image_size_getter_test.dart index 00fe771..e53f8b1 100644 --- a/library/test/image_size_getter_test.dart +++ b/library/test/image_size_getter_test.dart @@ -12,6 +12,13 @@ void main() { await expectLater(size, Size(988, 466)); }); + test('Test webp extended format size', () async { + final file = File('../example/asset/demo_extended.webp'); + final size = ImageSizeGetter.getSize(FileInput(file)); + print('size = $size'); + await expectLater(size, Size(988, 466)); + }); + test('Test jpeg size', () async { final file = File('../example/asset/IMG_20180908_080245.jpg'); final size = ImageSizeGetter.getSize(FileInput(file));