From 82d9b974cad9d0e627564a9420ece815a5f76bfc Mon Sep 17 00:00:00 2001 From: Ildar Khayrutdinov Date: Sat, 18 Sep 2021 22:13:49 +0300 Subject: [PATCH] memory reduce big values reading --- .../Metadata/Profiles/Exif/ExifReader.cs | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs index 7a102b3b2c..bae2d6c813 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs @@ -114,9 +114,22 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif protected void ReadExtValues(List values) { + ulong maxSize = 0; foreach ((ulong offset, ExifDataType dataType, ulong numberOfComponents, ExifValue exif) tag in this.ExtTags) { - this.ReadExtValue(values, tag); + ulong size = tag.numberOfComponents * ExifDataTypes.GetSize(tag.dataType); + if (size > maxSize) + { + maxSize = size; + } + } + + Span buf = new byte[maxSize]; + foreach ((ulong offset, ExifDataType dataType, ulong numberOfComponents, ExifValue exif) tag in this.ExtTags) + { + ulong size = tag.numberOfComponents * ExifDataTypes.GetSize(tag.dataType); + + this.ReadExtValue(values, tag, buf.Slice(0, (int)size)); } this.ExtTags.Clear(); @@ -174,14 +187,12 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif } } - protected void ReadExtValue(IList values, (ulong offset, ExifDataType dataType, ulong numberOfComponents, ExifValue exif) tag) + protected void ReadExtValue(IList values, (ulong offset, ExifDataType dataType, ulong numberOfComponents, ExifValue exif) tag, Span buffer) { - ulong size = tag.numberOfComponents * ExifDataTypes.GetSize(tag.dataType); - byte[] dataBuffer = new byte[size]; this.Seek(tag.offset); - if (this.TryReadSpan(dataBuffer)) + if (this.TryReadSpan(buffer)) { - object value = this.ConvertValue(tag.dataType, dataBuffer, tag.numberOfComponents > 1 || tag.exif.IsArray); + object value = this.ConvertValue(tag.dataType, buffer, tag.numberOfComponents > 1); this.Add(values, tag.exif, value); } } @@ -453,7 +464,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif exifValue = new ExifLong8Array(ExifTagValue.SubIFDs); break; default: - exifValue = exifValue = ExifValues.Create(tag) ?? ExifValues.Create(tag, dataType, numberOfComponents); + exifValue = ExifValues.Create(tag) ?? ExifValues.Create(tag, dataType, numberOfComponents); break; }