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());
}
}