diff --git a/src/Discord.Net.Core/Entities/Image.cs b/src/Discord.Net.Core/Entities/Image.cs
index c2c997365..2262d4bde 100644
--- a/src/Discord.Net.Core/Entities/Image.cs
+++ b/src/Discord.Net.Core/Entities/Image.cs
@@ -7,13 +7,16 @@ namespace Discord
public struct Image
{
public Stream Stream { get; }
+ public ImageFormat Format { get; }
+
///
/// Create the image with a Stream.
///
/// This must be some type of stream with the contents of a file in it.
- public Image(Stream stream)
+ public Image(Stream stream, ImageFormat format = ImageFormat.Jpeg)
{
Stream = stream;
+ Format = format;
}
#if FILESYSTEM
///
@@ -23,9 +26,10 @@ namespace Discord
/// This file path is NOT validated, and is passed directly into a
///
/// The path to the file.
- public Image(string path)
+ public Image(string path, ImageFormat format = ImageFormat.Jpeg)
{
Stream = File.OpenRead(path);
+ Format = format;
}
#endif
}
diff --git a/src/Discord.Net.Rest/API/Image.cs b/src/Discord.Net.Rest/API/Image.cs
index b2357a0a6..89173a975 100644
--- a/src/Discord.Net.Rest/API/Image.cs
+++ b/src/Discord.Net.Rest/API/Image.cs
@@ -5,16 +5,19 @@ namespace Discord.API
internal struct Image
{
public Stream Stream { get; }
+ public ImageFormat StreamFormat { get; }
public string Hash { get; }
- public Image(Stream stream)
+ public Image(Stream stream, ImageFormat format)
{
Stream = stream;
+ StreamFormat = format;
Hash = null;
}
public Image(string hash)
{
Stream = null;
+ StreamFormat = ImageFormat.Jpeg;
Hash = hash;
}
}
diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs
index b88a5b515..0312e7411 100644
--- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs
+++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs
@@ -114,7 +114,7 @@ namespace Discord.Rest
public static API.Image ToModel(this Image entity)
{
- return new API.Image(entity.Stream);
+ return new API.Image(entity.Stream, entity.Format);
}
public static Overwrite ToEntity(this API.Overwrite model)
diff --git a/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs b/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs
index 8062c0c9e..6d28136aa 100644
--- a/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs
+++ b/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs
@@ -1,12 +1,52 @@
-using System.Text.Json;
+using System;
+using System.Text.Json;
namespace Discord.Serialization.Json.Converters
{
internal class ImagePropertyConverter : IJsonPropertyConverter
{
public API.Image Read(PropertyMap map, ref JsonReader reader, bool isTopLevel)
- => throw new System.NotImplementedException();
+ {
+ if (isTopLevel)
+ reader.Read();
+ if (reader.ValueType != JsonValueType.String)
+ throw new SerializationException("Bad input, expected String");
+ return new API.Image(reader.ParseString());
+ }
public void Write(PropertyMap map, ref JsonWriter writer, API.Image value, bool isTopLevel)
- => throw new System.NotImplementedException();
+ {
+ string str;
+ if (value.Stream != null)
+ {
+ byte[] bytes = new byte[value.Stream.Length - value.Stream.Position];
+ value.Stream.Read(bytes, 0, bytes.Length);
+
+ string base64 = Convert.ToBase64String(bytes);
+ switch (value.StreamFormat)
+ {
+ case ImageFormat.Jpeg:
+ str = $"data:image/jpeg;base64,{base64}";
+ break;
+ case ImageFormat.Png:
+ str = $"data:image/png;base64,{base64}";
+ break;
+ case ImageFormat.Gif:
+ str = $"data:image/gif;base64,{base64}";
+ break;
+ case ImageFormat.WebP:
+ str = $"data:image/webp;base64,{base64}";
+ break;
+ default:
+ throw new SerializationException($"Unable to serialize an {nameof(Image)} with a format of {value.StreamFormat}");
+ }
+ }
+ else
+ str = value.Hash;
+
+ if (isTopLevel)
+ writer.WriteAttribute(map.Key, str);
+ else
+ writer.WriteValue(str);
+ }
}
}