File tree Expand file tree Collapse file tree 3 files changed +17
-3
lines changed Expand file tree Collapse file tree 3 files changed +17
-3
lines changed Original file line number Diff line number Diff line change @@ -24,19 +24,27 @@ namespace MetadataExtractor.Formats.Exif
24
24
/// <author>Drew Noakes https://drewnoakes.com</author>
25
25
public sealed class ExifReader : IJpegSegmentMetadataReader
26
26
{
27
- /// <summary>Exif data stored in JPEG files' APP1 segment are preceded by this six character preamble.</summary>
27
+ /// <summary>Exif data stored in JPEG files' APP1 segment are preceded by this six character preamble "Exif\0\0" .</summary>
28
28
public const string JpegSegmentPreamble = "Exif\x0\x0" ;
29
29
30
30
ICollection < JpegSegmentType > IJpegSegmentMetadataReader . SegmentTypes => new [ ] { JpegSegmentType . App1 } ;
31
31
32
32
public DirectoryList ReadJpegSegments ( IEnumerable < JpegSegment > segments )
33
33
{
34
34
return segments
35
- . Where ( segment => segment . Bytes . Length >= JpegSegmentPreamble . Length && Encoding . UTF8 . GetString ( segment . Bytes , 0 , JpegSegmentPreamble . Length ) == JpegSegmentPreamble )
35
+ . Where ( segment => StartsWithJpegExifPreamble ( segment . Bytes ) )
36
36
. SelectMany ( segment => Extract ( new ByteArrayReader ( segment . Bytes , baseOffset : JpegSegmentPreamble . Length ) ) )
37
37
. ToList ( ) ;
38
38
}
39
39
40
+ /// <summary>
41
+ /// Indicates whether <paramref name="bytes"/> starts with <see cref="JpegSegmentPreamble"/>.
42
+ /// </summary>
43
+ public static bool StartsWithJpegExifPreamble ( byte [ ] bytes )
44
+ {
45
+ return bytes . Length >= JpegSegmentPreamble . Length && Encoding . UTF8 . GetString ( bytes , 0 , JpegSegmentPreamble . Length ) == JpegSegmentPreamble ;
46
+ }
47
+
40
48
/// <summary>
41
49
/// Reads TIFF formatted Exif data a specified offset within a <see cref="IndexedReader"/>.
42
50
/// </summary>
Original file line number Diff line number Diff line change @@ -50,7 +50,12 @@ public void ProcessChunk(string fourCc, byte[] payload)
50
50
{
51
51
case "EXIF" :
52
52
{
53
- _directories . AddRange ( new ExifReader ( ) . Extract ( new ByteArrayReader ( payload ) ) ) ;
53
+ // We have seen WebP images with and without the preamble here. It's likely that some software incorrectly
54
+ // copied an entire JPEG segment into the WebP image. Regardless, we can handle it here.
55
+ var reader = ExifReader . StartsWithJpegExifPreamble ( payload )
56
+ ? new ByteArrayReader ( payload , ExifReader . JpegSegmentPreamble . Length )
57
+ : new ByteArrayReader ( payload ) ;
58
+ _directories . AddRange ( new ExifReader ( ) . Extract ( reader ) ) ;
54
59
break ;
55
60
}
56
61
case "ICCP" :
Original file line number Diff line number Diff line change 1
1
#nullable enable
2
+ static MetadataExtractor.Formats.Exif.ExifReader.StartsWithJpegExifPreamble(byte[]! bytes) -> bool
You can’t perform that action at this time.
0 commit comments