You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.9 KiB

using System;
using System.IO;
using Newtonsoft.Json;
using Model = Discord.API.Image;
namespace Discord.Net.Converters
{
internal class ImageConverter : JsonConverter
{
public static readonly ImageConverter Instance = new ImageConverter();
public override bool CanConvert(Type objectType) => true;
public override bool CanRead => true;
public override bool CanWrite => true;
/// <exception cref="InvalidOperationException">Cannot read from image.</exception>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new InvalidOperationException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var image = (Model)value;
if (image.Stream != null)
{
byte[] bytes;
int length;
if (image.Stream.CanSeek)
{
bytes = new byte[image.Stream.Length - image.Stream.Position];
length = image.Stream.Read(bytes, 0, bytes.Length);
}
else
{
using (var cloneStream = new MemoryStream())
{
image.Stream.CopyTo(cloneStream);
bytes = new byte[cloneStream.Length];
cloneStream.Position = 0;
cloneStream.Read(bytes, 0, bytes.Length);
length = (int)cloneStream.Length;
}
}
string base64 = Convert.ToBase64String(bytes, 0, length);
writer.WriteValue($"data:image/jpeg;base64,{base64}");
}
else if (image.Hash != null)
writer.WriteValue(image.Hash);
}
}
}