From 03547d078c5d47a4bcc8185a869daf1237baeab0 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 26 Apr 2020 17:32:22 +0200 Subject: [PATCH] Identify reads now exif data --- src/ImageSharp/Formats/Png/PngDecoderCore.cs | 9 +++ .../Formats/Png/PngMetadataTests.cs | 58 ++++++++++++++++++ tests/Images/Input/Png/PngWithMetaData.png | Bin 805 -> 751 bytes 3 files changed, 67 insertions(+) diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs index 7d9011a55..a5bcff3b2 100644 --- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs @@ -278,6 +278,15 @@ namespace SixLabors.ImageSharp.Formats.Png break; case PngChunkType.InternationalText: this.ReadInternationalTextChunk(pngMetadata, chunk.Data.Array.AsSpan(0, chunk.Length)); + break; + case PngChunkType.Exif: + if (!this.ignoreMetadata) + { + var exifData = new byte[chunk.Length]; + Buffer.BlockCopy(chunk.Data.Array, 0, exifData, 0, chunk.Length); + metadata.ExifProfile = new ExifProfile(exifData); + } + break; case PngChunkType.End: this.isEndChunkReached = true; diff --git a/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs index ee4e4f3c2..bf4206600 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.Metadata; +using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; using Xunit; @@ -129,6 +130,40 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png } } + [Theory] + [WithFile(TestImages.Png.PngWithMetadata, PixelTypes.Rgba32)] + public void Decode_ReadsExifData(TestImageProvider provider) + where TPixel : unmanaged, IPixel + { + var decoder = new PngDecoder + { + IgnoreMetadata = false + }; + + using (Image image = provider.GetImage(decoder)) + { + Assert.NotNull(image.Metadata.ExifProfile); + ExifProfile exif = image.Metadata.ExifProfile; + VerifyExifDataIsPresent(exif); + } + } + + [Theory] + [WithFile(TestImages.Png.PngWithMetadata, PixelTypes.Rgba32)] + public void Decode_IgnoresExifData_WhenIgnoreMetadataIsTrue(TestImageProvider provider) + where TPixel : unmanaged, IPixel + { + var decoder = new PngDecoder + { + IgnoreMetadata = true + }; + + using (Image image = provider.GetImage(decoder)) + { + Assert.Null(image.Metadata.ExifProfile); + } + } + [Fact] public void Decode_IgnoreMetadataIsFalse_TextChunkIsRead() { @@ -215,6 +250,29 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png } } + [Theory] + [InlineData(TestImages.Png.PngWithMetadata)] + public void Identify_ReadsExifData(string imagePath) + { + var testFile = TestFile.Create(imagePath); + using (var stream = new MemoryStream(testFile.Bytes, false)) + { + IImageInfo imageInfo = Image.Identify(stream); + Assert.NotNull(imageInfo); + Assert.NotNull(imageInfo.Metadata.ExifProfile); + ExifProfile exif = imageInfo.Metadata.ExifProfile; + VerifyExifDataIsPresent(exif); + } + } + + private static void VerifyExifDataIsPresent(ExifProfile exif) + { + Assert.Equal(1, exif.Values.Count); + IExifValue software = exif.GetValue(ExifTag.Software); + Assert.NotNull(software); + Assert.Equal("ImageSharp", software.Value); + } + private static void VerifyTextDataIsPresent(PngMetadata meta) { Assert.NotNull(meta); diff --git a/tests/Images/Input/Png/PngWithMetaData.png b/tests/Images/Input/Png/PngWithMetaData.png index af417b1f307329d72b536ab69170c1a06399d745..b5d0d344d7cf111b4f5d1784fac9b4fb1439b61a 100644 GIT binary patch delta 251 zcmZ3=_MUZu3J-IDPl#)2Qgob=n8m~ziHRx#2I{F1o@t(*S_~Wv3=E76hKx)M+(4ET z5UT>QXKrG8YH&tkQ2~&1JGcAg#9gH-(j~4DB`&GO$wiq3C7Jno49WSq1x2aF#i=Q} zC8-r9q8%#tCdV-PFj`Jt$tVLfCaoxuAuT^YDY1wlCsCmwr!+TJAthA-$j(j7D@ncM z6&^PE6XOC#TcCPrEhC^+$r+h>sl}-b&QSVg!^~$h)<4=1|x&vL^h2(ALIT{R%G;HbetT(B(2B5$dFc)$dHzw zpOjbx)N|T1MB{|!S>I3(&(IT|At!v#XnV3Uc>ZFSSvfU1eDZq61&nS$jk1P}49OXp zd8x&z49-xxVovog6zWSG$*yO&byLjPG(bE!!a%Y|ZmJF38lczFSb250k`njxg HN@xNA#T9AI