Skip to content

Commit 14d7b60

Browse files
support writing UCS-2 encoded string
1 parent 918db05 commit 14d7b60

File tree

2 files changed

+6
-8
lines changed

2 files changed

+6
-8
lines changed

src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
88
{
99
internal static class ExifUcs2StringHelpers
1010
{
11-
private static Encoding Ucs2Encoding => Encoding.GetEncoding("UCS-2");
11+
public static Encoding Ucs2Encoding => Encoding.GetEncoding("UCS-2");
1212

1313
public static bool IsUcs2Tag(ExifTagValue tag)
1414
{

src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ internal static uint GetNumberOfComponents(IExifValue exifValue)
276276

277277
if (exifValue.DataType == ExifDataType.Ascii)
278278
{
279-
return (uint)ExifConstants.DefaultEncoding.GetByteCount((string)value) + 1;
279+
return (uint)(ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag) ? ExifUcs2StringHelpers.Ucs2Encoding : ExifConstants.DefaultEncoding).GetByteCount((string)value) + 1;
280280
}
281281

282282
if (value is EncodedString encodedString)
@@ -297,7 +297,7 @@ private static int WriteArray(IExifValue value, Span<byte> destination, int offs
297297
int newOffset = offset;
298298
foreach (object obj in (Array)value.GetValue())
299299
{
300-
newOffset = WriteValue(value.DataType, obj, destination, newOffset);
300+
newOffset = WriteValue(value, value.DataType, obj, destination, newOffset);
301301
}
302302

303303
return newOffset;
@@ -373,17 +373,15 @@ private static void WriteSignedRational(Span<byte> destination, in SignedRationa
373373
BinaryPrimitives.WriteInt32LittleEndian(destination.Slice(4, 4), value.Denominator);
374374
}
375375

376-
private static int WriteValue(ExifDataType dataType, object value, Span<byte> destination, int offset)
376+
private static int WriteValue(IExifValue exifValue, ExifDataType dataType, object value, Span<byte> destination, int offset)
377377
{
378378
switch (dataType)
379379
{
380380
case ExifDataType.Ascii:
381-
offset = Write(ExifConstants.DefaultEncoding.GetBytes((string)value), destination, offset);
381+
offset = Write((ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag) ? ExifUcs2StringHelpers.Ucs2Encoding : ExifConstants.DefaultEncoding).GetBytes((string)value), destination, offset);
382382
destination[offset] = 0;
383383
return offset + 1;
384384
case ExifDataType.Byte:
385-
destination[offset] = (byte)value;
386-
return offset + 1;
387385
case ExifDataType.Undefined:
388386
if (value is EncodedString encodedString)
389387
{
@@ -450,7 +448,7 @@ internal static int WriteValue(IExifValue value, Span<byte> destination, int off
450448
return WriteArray(value, destination, offset);
451449
}
452450

453-
return WriteValue(value.DataType, value.GetValue(), destination, offset);
451+
return WriteValue(value, value.DataType, value.GetValue(), destination, offset);
454452
}
455453
}
456454
}

0 commit comments

Comments
 (0)