From 2216980c2f55e41fca5e389a14b0905b6c476fd3 Mon Sep 17 00:00:00 2001 From: Ildar Khayrutdinov Date: Sat, 8 Jan 2022 12:39:09 +0300 Subject: [PATCH] exif ifd writing fixes --- .../Metadata/Profiles/Exif/ExifWriter.cs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs index 82f4aac17d..2fb1924497 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs @@ -46,7 +46,6 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif public byte[] GetData() { const uint startIndex = 0; - uint length; IExifValue exifOffset = GetOffsetValue(this.ifdValues, this.exifValues, ExifTag.SubIFDOffset); IExifValue gpsOffset = GetOffsetValue(this.ifdValues, this.gpsValues, ExifTag.GPSIFDOffset); @@ -56,13 +55,13 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif return Array.Empty(); } - uint ifdLength = this.GetLength(this.ifdValues) + 4U; + uint ifdLength = this.GetLength(this.ifdValues); uint exifLength = this.GetLength(this.exifValues); uint gpsLength = this.GetLength(this.gpsValues); - length = ifdLength + exifLength + gpsLength; + uint length = ifdLength + exifLength + gpsLength; - if (length == 4U) + if (length == 0) { return Array.Empty(); } @@ -70,9 +69,10 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif // two bytes for the byte Order marker 'II' or 'MM', followed by the number 42 (0x2A) and a 0, making 4 bytes total length += (uint)ExifConstants.LittleEndianByteOrderMarker.Length; - length += 4 + 4; + // first IFD offset + length += 4; - var result = new byte[length]; + byte[] result = new byte[length]; int i = 0; @@ -80,15 +80,13 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif ExifConstants.LittleEndianByteOrderMarker.CopyTo(result.AsSpan(start: i)); i += ExifConstants.LittleEndianByteOrderMarker.Length; - uint ifdOffset = ((uint)i - startIndex) + 4U; - uint thumbnailOffset = ifdOffset + ifdLength + exifLength + gpsLength; + uint ifdOffset = (uint)i - startIndex + 4U; exifOffset?.TrySetValue(ifdOffset + ifdLength); gpsOffset?.TrySetValue(ifdOffset + ifdLength + exifLength); i = WriteUInt32(ifdOffset, result, i); i = this.WriteHeaders(this.ifdValues, result, i); - i = WriteUInt32(thumbnailOffset, result, i); i = this.WriteData(startIndex, this.ifdValues, result, i); if (exifLength > 0) @@ -103,8 +101,6 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif i = this.WriteData(startIndex, this.gpsValues, result, i); } - WriteUInt32(0, result, i); - return result; } @@ -263,7 +259,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { uint valueLength = GetLength(value); - length += 2 + 2 + 4 + 4; + length += 12; if (valueLength > 4) { @@ -271,6 +267,9 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif } } + // next IFD offset + length += 4; + return length; } @@ -361,6 +360,9 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif newOffset += 4; } + // next IFD offset + newOffset = WriteUInt32(0, destination, newOffset); + return newOffset; }