Skip to content

Commit ef9d71e

Browse files
authored
Feat add no standard jpeg decoder (#41)
* feat: add non-standard jpeg decoder - add non-standard jpeg decoder - add test for non-standard jpeg Signed-off-by: Caijinglong <[email protected]>
1 parent d691481 commit ef9d71e

File tree

6 files changed

+51
-4
lines changed

6 files changed

+51
-4
lines changed

example/asset/test.MP.jpg

4.43 MB
Loading

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.2.0](#220)
45
- [2.1.3](#213)
56
- [2.1.2](#212)
67
- [2.1.1](#211)
@@ -14,6 +15,12 @@
1415
- [0.1.1](#011)
1516
- [0.1.0](#010)
1617

18+
## 2.2.0
19+
20+
Feature:
21+
22+
- Add non-standard jpeg decoder
23+
1724
## 2.1.3
1825

1926
Fix:

packages/image_size_getter/lib/src/decoder/impl/jpeg_decoder.dart

+23-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ import 'package:image_size_getter/src/entity/block_entity.dart';
99
/// {@endtemplate}
1010
class JpegDecoder extends BaseDecoder with SimpleTypeValidator {
1111
/// {@macro image_size_getter.JpegDecoder}
12-
const JpegDecoder();
12+
const JpegDecoder({
13+
this.isStandardJpeg = true,
14+
});
1315

16+
final bool isStandardJpeg;
1417
@override
15-
String get decoderName => 'jpeg';
18+
String get decoderName => isStandardJpeg ? 'jpeg' : 'non-standard-jpeg';
1619

1720
@override
1821
Size getSize(ImageInput input) {
@@ -138,7 +141,8 @@ class JpegDecoder extends BaseDecoder with SimpleTypeValidator {
138141
}
139142

140143
@override
141-
SimpleFileHeaderAndFooter get simpleFileHeaderAndFooter => _JpegInfo();
144+
SimpleFileHeaderAndFooter get simpleFileHeaderAndFooter =>
145+
isStandardJpeg ? _JpegInfo() : _NonStandardJpegInfo();
142146

143147
int? _getOrientation(List<int> app1blockData) {
144148
// About EXIF, See: https://www.media.mit.edu/pia/Research/deepview/exif.html#orientation
@@ -213,3 +217,19 @@ class _JpegInfo with SimpleFileHeaderAndFooter {
213217
@override
214218
List<int> get startBytes => start;
215219
}
220+
221+
/// Non-standard JPEG Info
222+
///
223+
/// Some mvimg files have a non-standard header.
224+
///
225+
/// The file is not end with 0xFFD9, so we need to use this to get the size.
226+
class _NonStandardJpegInfo with SimpleFileHeaderAndFooter {
227+
static const start = [0xFF, 0xD8];
228+
static const end = <int>[];
229+
230+
@override
231+
List<int> get endBytes => end;
232+
233+
@override
234+
List<int> get startBytes => start;
235+
}

packages/image_size_getter/lib/src/image_size_getter.dart

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class _DecoderContainer extends IterableBase<BaseDecoder> {
4141
final _decoders = _DecoderContainer([
4242
const GifDecoder(),
4343
const JpegDecoder(),
44+
const JpegDecoder(isStandardJpeg: false),
4445
const WebpDecoder(),
4546
const PngDecoder(),
4647
const BmpDecoder(),

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.1.3
3+
version: 2.2.0
44
homepage: https://github.com/CaiJingLong/dart_image_size_getter
55
# publish_to: https://pub.dev
66

packages/image_size_getter/test/image_size_getter_test.dart

+19
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ void main() {
2626
expect(decoder.getSize(input), Size(4032, 3024));
2727
});
2828

29+
30+
test('Test non-standard jpeg decoder', () {
31+
final jpeg = File('../../example/asset/test.MP.jpg');
32+
33+
const JpegDecoder decoder = JpegDecoder(isStandardJpeg: false);
34+
final input = FileInput(jpeg);
35+
36+
assert(decoder.isValid(input));
37+
expect(decoder.getSize(input), Size(3840, 2160, needRotate: true));
38+
});
39+
40+
2941
test('Test png decoder', () {
3042
final png = File('../../example/asset/ic_launcher.png');
3143

@@ -103,6 +115,13 @@ void main() {
103115
await expectLater(size, Size(4032, 3024));
104116
});
105117

118+
test('Test non-standard jpeg size', () async {
119+
final file = File('../../example/asset/test.MP.jpg');
120+
final size = ImageSizeGetter.getSize(FileInput(file));
121+
print('size = $size');
122+
await expectLater(size, Size(3840, 2160, needRotate: true));
123+
});
124+
106125
group('Test gif size', () {
107126
test('89a', () async {
108127
final file = File('../../example/asset/dialog.gif');

0 commit comments

Comments
 (0)