|
|
|
@ -46,23 +46,17 @@ 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); |
|
|
|
|
|
|
|
if (this.ifdValues.Count == 0 && this.exifValues.Count == 0 && this.gpsValues.Count == 0) |
|
|
|
{ |
|
|
|
return Array.Empty<byte>(); |
|
|
|
} |
|
|
|
|
|
|
|
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<byte>(); |
|
|
|
} |
|
|
|
@ -70,9 +64,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 + 2; |
|
|
|
// first IFD offset
|
|
|
|
length += 4; |
|
|
|
|
|
|
|
var result = new byte[length]; |
|
|
|
byte[] result = new byte[length]; |
|
|
|
|
|
|
|
int i = 0; |
|
|
|
|
|
|
|
@ -80,15 +75,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 +96,6 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif |
|
|
|
i = this.WriteData(startIndex, this.gpsValues, result, i); |
|
|
|
} |
|
|
|
|
|
|
|
WriteUInt16(0, result, i); |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
@ -263,7 +254,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif |
|
|
|
{ |
|
|
|
uint valueLength = GetLength(value); |
|
|
|
|
|
|
|
length += 2 + 2 + 4 + 4; |
|
|
|
length += 12; |
|
|
|
|
|
|
|
if (valueLength > 4) |
|
|
|
{ |
|
|
|
@ -271,6 +262,9 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// next IFD offset
|
|
|
|
length += 4; |
|
|
|
|
|
|
|
return length; |
|
|
|
} |
|
|
|
|
|
|
|
@ -361,6 +355,9 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif |
|
|
|
newOffset += 4; |
|
|
|
} |
|
|
|
|
|
|
|
// next IFD offset
|
|
|
|
newOffset = WriteUInt32(0, destination, newOffset); |
|
|
|
|
|
|
|
return newOffset; |
|
|
|
} |
|
|
|
|
|
|
|
|