Browse Source

Strip out dominant pixel methods.

The two methods added yesterday are too generic and not best placed in
core. Could be an extension method for the web version though. Replaced
with ToString() override.


Former-commit-id: fe3126102c16e1499536b13dfdfe705246f29869
Former-commit-id: 7f5b08ed913df21285b01d6ded3d7922203c050c
Former-commit-id: 70d8c9dc185b715402b6092be342755020ddcc70
pull/1/head
James Jackson-South 10 years ago
parent
commit
ad03cd5390
  1. 17
      src/ImageProcessorCore/Image.cs
  2. 42
      src/ImageProcessorCore/ImageExtensions.cs
  3. 12
      tests/ImageProcessorCore.Tests/Formats/EncoderDecoderTests.cs

17
src/ImageProcessorCore/Image.cs

@ -223,6 +223,21 @@ namespace ImageProcessorCore
encoder.Encode(this, stream);
}
/// <summary>
/// Returns a Base64 encoded string from the given image.
/// </summary>
/// <example>data:image/gif;base64,R0lGODlhAQABAIABAEdJRgAAACwAAAAAAQABAAACAkQBAA==</example>
/// <returns>The <see cref="string"/></returns>
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())}";
}
}
/// <inheritdoc/>
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;

42
src/ImageProcessorCore/ImageExtensions.cs

@ -50,52 +50,20 @@ namespace ImageProcessorCore
/// <param name="stream">The stream to save the image to.</param>
/// <param name="quality">The quality to save the image to representing the number of colors. Between 1 and 100.</param>
/// <exception cref="ArgumentNullException">Thrown if the stream is null.</exception>
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);
/// <summary>
/// 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.
/// </summary>
/// <remarks>
/// The idea and code is based on the article at <see href="https://manu.ninja/dominant-colors-for-lazy-loading-images"/>
/// </remarks>
/// <param name="source">The image this method extends.</param>
/// <returns>The <see cref="string"/></returns>
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);
}
}
/// <summary>
/// Returns a 3x3 pixel Base64 encoded gif from the given image.
/// </summary>
/// <remarks>
/// The idea and code is based on the article at <see href="https://manu.ninja/dominant-colors-for-lazy-loading-images"/>
/// </remarks>
/// <param name="source">The image this method extends.</param>
/// <returns>The <see cref="string"/></returns>
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())}";
}
}

12
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");

Loading…
Cancel
Save