From 14d7b60a12355b410d62132f15c9763c85dcee1a Mon Sep 17 00:00:00 2001 From: Ildar Khayrutdinov Date: Wed, 19 Jan 2022 13:31:58 +0300 Subject: [PATCH] support writing UCS-2 encoded string --- .../Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs | 2 +- src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs index 00554f9ad6..cff6fe6120 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { internal static class ExifUcs2StringHelpers { - private static Encoding Ucs2Encoding => Encoding.GetEncoding("UCS-2"); + public static Encoding Ucs2Encoding => Encoding.GetEncoding("UCS-2"); public static bool IsUcs2Tag(ExifTagValue tag) { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs index dfd7a599b0..f52d2a314d 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs @@ -276,7 +276,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif if (exifValue.DataType == ExifDataType.Ascii) { - return (uint)ExifConstants.DefaultEncoding.GetByteCount((string)value) + 1; + return (uint)(ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag) ? ExifUcs2StringHelpers.Ucs2Encoding : ExifConstants.DefaultEncoding).GetByteCount((string)value) + 1; } if (value is EncodedString encodedString) @@ -297,7 +297,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif int newOffset = offset; foreach (object obj in (Array)value.GetValue()) { - newOffset = WriteValue(value.DataType, obj, destination, newOffset); + newOffset = WriteValue(value, value.DataType, obj, destination, newOffset); } return newOffset; @@ -373,17 +373,15 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif BinaryPrimitives.WriteInt32LittleEndian(destination.Slice(4, 4), value.Denominator); } - private static int WriteValue(ExifDataType dataType, object value, Span destination, int offset) + private static int WriteValue(IExifValue exifValue, ExifDataType dataType, object value, Span destination, int offset) { switch (dataType) { case ExifDataType.Ascii: - offset = Write(ExifConstants.DefaultEncoding.GetBytes((string)value), destination, offset); + offset = Write((ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag) ? ExifUcs2StringHelpers.Ucs2Encoding : ExifConstants.DefaultEncoding).GetBytes((string)value), destination, offset); destination[offset] = 0; return offset + 1; case ExifDataType.Byte: - destination[offset] = (byte)value; - return offset + 1; case ExifDataType.Undefined: if (value is EncodedString encodedString) { @@ -450,7 +448,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif return WriteArray(value, destination, offset); } - return WriteValue(value.DataType, value.GetValue(), destination, offset); + return WriteValue(value, value.DataType, value.GetValue(), destination, offset); } } }