Browse Source

support writing UCS-2 encoded string

pull/1935/head
Ildar Khayrutdinov 5 years ago
parent
commit
14d7b60a12
  1. 2
      src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs
  2. 12
      src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs

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

@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
{ {
internal static class ExifUcs2StringHelpers 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) public static bool IsUcs2Tag(ExifTagValue tag)
{ {

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

@ -276,7 +276,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
if (exifValue.DataType == ExifDataType.Ascii) 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) if (value is EncodedString encodedString)
@ -297,7 +297,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
int newOffset = offset; int newOffset = offset;
foreach (object obj in (Array)value.GetValue()) foreach (object obj in (Array)value.GetValue())
{ {
newOffset = WriteValue(value.DataType, obj, destination, newOffset); newOffset = WriteValue(value, value.DataType, obj, destination, newOffset);
} }
return newOffset; return newOffset;
@ -373,17 +373,15 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
BinaryPrimitives.WriteInt32LittleEndian(destination.Slice(4, 4), value.Denominator); BinaryPrimitives.WriteInt32LittleEndian(destination.Slice(4, 4), value.Denominator);
} }
private static int WriteValue(ExifDataType dataType, object value, Span<byte> destination, int offset) private static int WriteValue(IExifValue exifValue, ExifDataType dataType, object value, Span<byte> destination, int offset)
{ {
switch (dataType) switch (dataType)
{ {
case ExifDataType.Ascii: 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; destination[offset] = 0;
return offset + 1; return offset + 1;
case ExifDataType.Byte: case ExifDataType.Byte:
destination[offset] = (byte)value;
return offset + 1;
case ExifDataType.Undefined: case ExifDataType.Undefined:
if (value is EncodedString encodedString) if (value is EncodedString encodedString)
{ {
@ -450,7 +448,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
return WriteArray(value, destination, offset); return WriteArray(value, destination, offset);
} }
return WriteValue(value.DataType, value.GetValue(), destination, offset); return WriteValue(value, value.DataType, value.GetValue(), destination, offset);
} }
} }
} }

Loading…
Cancel
Save