diff --git a/src/ImageProcessorCore/Image.cs b/src/ImageProcessorCore/Image.cs index 745b617b38..e772ad2c03 100644 --- a/src/ImageProcessorCore/Image.cs +++ b/src/ImageProcessorCore/Image.cs @@ -223,6 +223,21 @@ namespace ImageProcessorCore encoder.Encode(this, stream); } + /// + /// Returns a Base64 encoded string from the given image. + /// + /// data:image/gif;base64,R0lGODlhAQABAIABAEdJRgAAACwAAAAAAQABAAACAkQBAA== + /// The + public override string ToString() + { + using (MemoryStream stream = new MemoryStream()) + { + this.Save(stream); + stream.Flush(); + return $"data:{this.CurrentImageFormat.Encoder.MimeType};base64,{Convert.ToBase64String(stream.ToArray())}"; + } + } + /// protected override void Dispose(bool disposing) { @@ -277,7 +292,7 @@ namespace ImageProcessorCore if (maxHeaderSize > 0) { byte[] header = new byte[maxHeaderSize]; - + stream.Position = 0; stream.Read(header, 0, maxHeaderSize); stream.Position = 0; diff --git a/src/ImageProcessorCore/ImageExtensions.cs b/src/ImageProcessorCore/ImageExtensions.cs index 420132236b..7edb5aaa5d 100644 --- a/src/ImageProcessorCore/ImageExtensions.cs +++ b/src/ImageProcessorCore/ImageExtensions.cs @@ -50,52 +50,20 @@ namespace ImageProcessorCore /// The stream to save the image to. /// The quality to save the image to representing the number of colors. Between 1 and 100. /// Thrown if the stream is null. - public static void SaveAsGif(this ImageBase source, Stream stream, int quality = 256) => new GifEncoder() { Quality = quality }.Encode(source, stream); + public static void SaveAsGif(this ImageBase source, Stream stream, int quality = 256) => new GifEncoder { Quality = quality }.Encode(source, stream); /// - /// Returns a 1x1 pixel Base64 encoded gif from the given image containing a single dominant color. + /// Returns a Base64 encoded string from the given image. /// - /// - /// The idea and code is based on the article at - /// - /// The image this method extends. - /// The - public static string ToBase64GifPixelString(this Image source) - { - // Leave the original image intact - using (Image temp = new Image(source)) - { - Bgra32 color = new OctreeQuantizer().Quantize(temp.Resize(250, 250), 1).Palette[0]; - - byte[] gif = { - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, // Header - 0x01, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, // Logical Screen Descriptor - color.R, color.G, color.B, 0x00, 0x00, 0x00, // Global Color Table - 0x2C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, // Image Descriptor - 0x02, 0x02, 0x44, 0x01, 0x00 // Image Data - }; - - return "data:image/gif;base64," + Convert.ToBase64String(gif); - } - } - - /// - /// Returns a 3x3 pixel Base64 encoded gif from the given image. - /// - /// - /// The idea and code is based on the article at - /// /// The image this method extends. /// The - public static string ToBase64GifString(this Image source) + public static string ToBase64String(this Image source) { - // Leave the original image intact - using (Image temp = new Image(source)) using (MemoryStream stream = new MemoryStream()) { - temp.Resize(3, 3).SaveAsGif(stream); + source.Save(stream); stream.Flush(); - return "data:image/gif;base64," + Convert.ToBase64String(stream.ToArray()); + return $"data:{source.CurrentImageFormat.Encoder.MimeType};base64,{Convert.ToBase64String(stream.ToArray())}"; } } diff --git a/tests/ImageProcessorCore.Tests/Formats/EncoderDecoderTests.cs b/tests/ImageProcessorCore.Tests/Formats/EncoderDecoderTests.cs index 488e570381..05585284b4 100644 --- a/tests/ImageProcessorCore.Tests/Formats/EncoderDecoderTests.cs +++ b/tests/ImageProcessorCore.Tests/Formats/EncoderDecoderTests.cs @@ -18,11 +18,11 @@ namespace ImageProcessorCore.Tests public class EncoderDecoderTests : FileTestBase { [Fact] - public void ImageCanEncodeToDominantPixel() + public void ImageCanEncodeToString() { - if (!Directory.Exists("TestOutput/Dominant")) + if (!Directory.Exists("TestOutput/ToString")) { - Directory.CreateDirectory("TestOutput/Dominant"); + Directory.CreateDirectory("TestOutput/ToString"); } foreach (string file in Files) @@ -32,10 +32,8 @@ namespace ImageProcessorCore.Tests Stopwatch watch = Stopwatch.StartNew(); using (Image image = new Image(stream)) { - string filename = "TestOutput/Dominant/" + Path.GetFileNameWithoutExtension(file) + ".txt"; - string filename2 = "TestOutput/Dominant/Pixel-" + Path.GetFileNameWithoutExtension(file) + ".txt"; - File.WriteAllText(filename, image.ToBase64GifString()); - File.WriteAllText(filename2, image.ToBase64GifPixelString()); + string filename = "TestOutput/ToString/" + Path.GetFileNameWithoutExtension(file) + ".txt"; + File.WriteAllText(filename, image.ToString()); } Trace.WriteLine($"{watch.ElapsedMilliseconds}ms");