Skip to content

Commit 095effc

Browse files
committed
Support Exif in PNG files
1 parent e656833 commit 095effc

File tree

6 files changed

+32
-1
lines changed

6 files changed

+32
-1
lines changed

MetadataExtractor/Formats/Png/PngChunkType.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ private static readonly ICollection<string> _identifiersAllowingMultiples
108108

109109
public static readonly PngChunkType zTXt = new PngChunkType("zTXt", true);
110110

111+
public static readonly PngChunkType eXIf = new PngChunkType("eXIf");
112+
111113
#endregion
112114

113115
#pragma warning restore IDE1006 // Naming Styles

MetadataExtractor/Formats/Png/PngMetadataReader.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using MetadataExtractor.Formats.Icc;
1313
using MetadataExtractor.Formats.FileSystem;
1414
using MetadataExtractor.Formats.Iptc;
15+
using MetadataExtractor.Formats.Tiff;
1516
using MetadataExtractor.Formats.Xmp;
1617
using MetadataExtractor.IO;
1718
using MetadataExtractor.Util;
@@ -42,7 +43,8 @@ public static class PngMetadataReader
4243
PngChunkType.iTXt,
4344
PngChunkType.tIME,
4445
PngChunkType.pHYs,
45-
PngChunkType.sBIT
46+
PngChunkType.sBIT,
47+
PngChunkType.eXIf
4648
};
4749

4850
/// <exception cref="PngProcessingException"/>
@@ -317,7 +319,9 @@ private static IEnumerable<Directory> ProcessChunk(PngChunk chunk)
317319
directory.Set(PngDirectory.TagLastModificationTime, time);
318320
}
319321
else
322+
{
320323
directory.AddError($"PNG tIME data describes an invalid date/time: year={year} month={month} day={day} hour={hour} minute={minute} second={second}");
324+
}
321325
yield return directory;
322326
}
323327
else if (chunkType == PngChunkType.pHYs)
@@ -338,6 +342,27 @@ private static IEnumerable<Directory> ProcessChunk(PngChunk chunk)
338342
directory.Set(PngDirectory.TagSignificantBits, bytes);
339343
yield return directory;
340344
}
345+
else if (chunkType.Equals(PngChunkType.eXIf))
346+
{
347+
var directories = new List<Directory>();
348+
try
349+
{
350+
TiffReader.ProcessTiff(
351+
new ByteArrayReader(bytes),
352+
new ExifTiffHandler(directories));
353+
}
354+
catch (Exception ex)
355+
{
356+
var directory = new PngDirectory(PngChunkType.eXIf);
357+
directory.AddError(ex.Message);
358+
directories.Add(directory);
359+
}
360+
361+
foreach (var directory in directories)
362+
{
363+
yield return directory;
364+
}
365+
}
341366

342367
yield break;
343368

MetadataExtractor/PublicAPI/net35/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAccel
88
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagContentIdentifier = 17 -> int
99
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageUniqueId = 21 -> int
1010
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagLivePhotoId = 23 -> int
11+
static readonly MetadataExtractor.Formats.Png.PngChunkType.eXIf -> MetadataExtractor.Formats.Png.PngChunkType!

MetadataExtractor/PublicAPI/net45/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAccel
88
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagContentIdentifier = 17 -> int
99
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageUniqueId = 21 -> int
1010
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagLivePhotoId = 23 -> int
11+
static readonly MetadataExtractor.Formats.Png.PngChunkType.eXIf -> MetadataExtractor.Formats.Png.PngChunkType!

MetadataExtractor/PublicAPI/netstandard1.3/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAccel
88
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagContentIdentifier = 17 -> int
99
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageUniqueId = 21 -> int
1010
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagLivePhotoId = 23 -> int
11+
static readonly MetadataExtractor.Formats.Png.PngChunkType.eXIf -> MetadataExtractor.Formats.Png.PngChunkType!

MetadataExtractor/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagAccel
88
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagContentIdentifier = 17 -> int
99
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagImageUniqueId = 21 -> int
1010
const MetadataExtractor.Formats.Exif.Makernotes.AppleMakernoteDirectory.TagLivePhotoId = 23 -> int
11+
static readonly MetadataExtractor.Formats.Png.PngChunkType.eXIf -> MetadataExtractor.Formats.Png.PngChunkType!

0 commit comments

Comments
 (0)