diff --git a/src/ImageSharp/Formats/Jpeg/JpegComData.cs b/src/ImageSharp/Formats/Jpeg/JpegComData.cs new file mode 100644 index 000000000..26ade0217 --- /dev/null +++ b/src/ImageSharp/Formats/Jpeg/JpegComData.cs @@ -0,0 +1,32 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +namespace SixLabors.ImageSharp.Formats.Jpeg; + +/// +/// Contains JPEG comment +/// +public readonly struct JpegComData +{ + /// + /// Converts string to + /// + /// The comment string. + /// The + public static JpegComData FromString(string value) => new(value.AsMemory()); + + /// + /// Initializes a new instance of the struct. + /// + /// The comment ReadOnlyMemory of chars. + public JpegComData(ReadOnlyMemory value) + => this.Value = value; + + public ReadOnlyMemory Value { get; } + + /// + /// Converts Value to string + /// + /// The comment string. + public override string ToString() => this.Value.ToString(); +} diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs index 5f3fa33fa..e43c20a7d 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs @@ -529,7 +529,7 @@ internal sealed class JpegDecoderCore : IRawJpegData, IImageDecoderInternals stream.Read(temp); string comment = Encoding.ASCII.GetString(temp); - metadata.Comments.Add(comment); + metadata.Comments.Add(JpegComData.FromString(comment)); } /// diff --git a/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs index 8658f6b25..a55435c53 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs @@ -186,12 +186,12 @@ internal sealed unsafe partial class JpegEncoderCore : IImageEncoderInternals for (int i = 0; i < metadata.Comments.Count; i++) { - string comment = metadata.Comments[i]; + string comment = metadata.Comments[i].ToString(); if (comment.Length > maxCommentLength) { string splitComment = comment.Substring(maxCommentLength, comment.Length - maxCommentLength); - metadata.Comments.Insert(i + 1, splitComment); + metadata.Comments.Insert(i + 1, JpegComData.FromString(splitComment)); // We don't want to keep the extra bytes comment = comment.Substring(0, maxCommentLength); diff --git a/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs b/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs index 5b96fdf96..fe1324a86 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs @@ -15,7 +15,7 @@ public class JpegMetadata : IDeepCloneable /// public JpegMetadata() { - this.Comments = new List(); + this.Comments = new List(); } /// @@ -106,7 +106,7 @@ public class JpegMetadata : IDeepCloneable /// /// Gets the comments. /// - public IList Comments { get; } + public IList Comments { get; } /// public IDeepCloneable DeepClone() => new JpegMetadata(this); diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Metadata.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Metadata.cs index 222d1fb8c..cbb2befcd 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Metadata.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Metadata.cs @@ -435,7 +435,7 @@ public partial class JpegDecoderTests JpegMetadata metadata = image.Metadata.GetJpegMetadata(); Assert.Equal(1, metadata.Comments.Count); - Assert.Equal(expectedComment, metadata.Comments.ElementAtOrDefault(0)); + Assert.Equal(expectedComment, metadata.Comments.ElementAtOrDefault(0).ToString()); image.DebugSave(provider); image.CompareToOriginal(provider); } diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.Metadata.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.Metadata.cs index f33234e32..e49afedbb 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.Metadata.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.Metadata.cs @@ -172,7 +172,7 @@ public partial class JpegEncoderTests JpegMetadata actual = output.Metadata.GetJpegMetadata(); Assert.NotEmpty(actual.Comments); Assert.Equal(1, actual.Comments.Count); - Assert.Equal("TEST COMMENT", actual.Comments.ElementAtOrDefault(0)); + Assert.Equal("TEST COMMENT", actual.Comments.ElementAtOrDefault(0).ToString()); } [Fact] @@ -184,8 +184,8 @@ public partial class JpegEncoderTests using var memStream = new MemoryStream(); // act - meta.Comments.Add("First comment"); - meta.Comments.Add("Second Comment"); + meta.Comments.Add(JpegComData.FromString("First comment")); + meta.Comments.Add(JpegComData.FromString("Second Comment")); input.Save(memStream, JpegEncoder); // assert @@ -194,8 +194,8 @@ public partial class JpegEncoderTests JpegMetadata actual = output.Metadata.GetJpegMetadata(); Assert.NotEmpty(actual.Comments); Assert.Equal(2, actual.Comments.Count); - Assert.Equal(meta.Comments.ElementAtOrDefault(0), actual.Comments.ElementAtOrDefault(0)); - Assert.Equal(meta.Comments.ElementAtOrDefault(1), actual.Comments.ElementAtOrDefault(1)); + Assert.Equal(meta.Comments.ElementAtOrDefault(0).ToString(), actual.Comments.ElementAtOrDefault(0).ToString()); + Assert.Equal(meta.Comments.ElementAtOrDefault(1).ToString(), actual.Comments.ElementAtOrDefault(1).ToString()); } [Theory] diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs index 64d7edd75..e07c42f89 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs @@ -64,7 +64,7 @@ public class JpegMetadataTests { var meta = new JpegMetadata(); - Assert.True(Array.Empty().SequenceEqual(meta.Comments)); + Assert.True(Array.Empty().SequenceEqual(meta.Comments)); } [Fact] @@ -74,9 +74,9 @@ public class JpegMetadataTests var expectedCollection = new Collection { comment }; var meta = new JpegMetadata(); - meta.Comments.Add(comment); + meta.Comments.Add(JpegComData.FromString(comment)); Assert.Equal(1, meta.Comments.Count); - Assert.True(expectedCollection.FirstOrDefault() == meta.Comments.FirstOrDefault()); + Assert.True(expectedCollection.FirstOrDefault() == meta.Comments.FirstOrDefault().ToString()); } }