From 2a9fa223de5acd644307ae7f755c03071e1db85f Mon Sep 17 00:00:00 2001
From: Patrik Svensson <patrik@patriksvensson.se>
Date: Tue, 24 Nov 2020 21:24:21 +0100
Subject: [PATCH] Add canvas and image support

Adds support for drawing "pixels" and displaying
images in the terminal.
---
 README.md                                     | 110 +++----------
 examples/Canvas/Canvas.csproj                 |  22 +++
 examples/Canvas/Mandelbrot.cs                 |  87 ++++++++++
 examples/Canvas/Program.cs                    |  36 +++++
 examples/Canvas/cake.png                      | Bin 0 -> 52832 bytes
 examples/Rules/Program.cs                     |  10 +-
 src/Spectre.Console.ImageSharp/CanvasImage.cs | 125 +++++++++++++++
 .../CanvasImageExtensions.cs                  | 135 ++++++++++++++++
 .../Spectre.Console.ImageSharp.csproj         |  22 +++
 src/Spectre.Console.sln                       |  29 ++++
 src/Spectre.Console/Widgets/Canvas.cs         | 151 ++++++++++++++++++
 11 files changed, 633 insertions(+), 94 deletions(-)
 create mode 100644 examples/Canvas/Canvas.csproj
 create mode 100644 examples/Canvas/Mandelbrot.cs
 create mode 100644 examples/Canvas/Program.cs
 create mode 100644 examples/Canvas/cake.png
 create mode 100644 src/Spectre.Console.ImageSharp/CanvasImage.cs
 create mode 100644 src/Spectre.Console.ImageSharp/CanvasImageExtensions.cs
 create mode 100644 src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj
 create mode 100644 src/Spectre.Console/Widgets/Canvas.cs

diff --git a/README.md b/README.md
index 62790c8..9b964ce 100644
--- a/README.md
+++ b/README.md
@@ -2,19 +2,17 @@
 
 _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_
 
-A .NET Standard 2.0 library that makes it easier to create beautiful console applications.  
+A .NET 5/.NET Standard 2.0 library that makes it easier to create beautiful, cross platform, console applications.  
 It is heavily inspired by the excellent [Rich library](https://github.com/willmcgugan/rich) 
 for Python.
 
 ## Table of Contents
 
 1. [Features](#features)
-2. [Example](#example)
-3. [Installing](#installing)
-4. [Usage](#usage)  
-   4.1. [Using the static API](#using-the-static-api)  
-   4.2. [Creating a console](#creating-a-console)
-5. [Running examples](#running-examples)
+2. [Installing](#installing)
+3. [Documentation](#documentation)
+4. [Examples](#examples)
+5. [License](#license)
 
 ## Features
 
@@ -25,77 +23,27 @@ for Python.
   and blinking text.
 * Supports 3/4/8/24-bit colors in the terminal.  
   The library will detect the capabilities of the current terminal 
-  and downgrade colors as needed.
+  and downgrade colors as needed.  
 
-## Example
 
 ![Example](resources/gfx/screenshots/example.png)
 
 ## Installing
 
-The fastest way of getting started using Spectre.Console is to install the NuGet package.
+The fastest way of getting started using `Spectre.Console` is to install the NuGet package.
 
 ```csharp
 dotnet add package Spectre.Console
 ```
 
-## Usage
+## Documentation
 
-The `Spectre.Console` API is stateful and is not thread-safe.
-If you need to write to the console from different threads, make sure that 
-you take appropriate precautions, just like when you use the 
-regular `System.Console` API.
+The documentation for `Spectre.Console` can be found at
+https://spectresystems.github.io/spectre.console/
 
-If the current terminal does not support ANSI escape sequences, 
-`Spectre.Console` will fallback to using the `System.Console` API.
+## Examples
 
-_NOTE: This library is currently under development and APIs 
-might change or get removed at any point up until a 1.0 release._
-
-### Using the static API
-
-The static API is perfect when you just want to output text
-like you usually do with the `System.Console` API, but prettier.
-
-```csharp
-AnsiConsole.Foreground = Color.CornflowerBlue;
-AnsiConsole.Decoration = Decoration.Underline | Decoration.Bold;
-AnsiConsole.WriteLine("Hello World!");
-
-AnsiConsole.Reset();
-AnsiConsole.MarkupLine("[bold yellow on red]{0}[/] [underline]world[/]!", "Goodbye");
-```
-
-If you want to get a reference to the default `IAnsiConsole`, 
-you can access it via `AnsiConsole.Console`.
-
-### Creating a console
-
-Sometimes it's useful to explicitly create a console with specific 
-capabilities, such as during unit testing when you want control 
-over the environment your code runs in. 
-
-It's recommended to not use `AnsiConsole` in code that run as 
-part of a unit test.
-
-```csharp
-IAnsiConsole console = AnsiConsole.Create(
-    new AnsiConsoleSettings()
-    {
-        Ansi = AnsiSupport.Yes,
-        ColorSystem = ColorSystemSupport.TrueColor,
-        Out = new StringWriter(),
-    });
-```
-
-_NOTE: Even if you can specify a specific color system to use 
-when manually creating a console, remember that the user's terminal 
-might not be able to use it, so unless you're creating an IAnsiConsole 
-for testing, always use `ColorSystemSupport.Detect` and `AnsiSupport.Detect`._
-
-## Running examples
-
-To see Spectre.Console in action, install the 
+To see `Spectre.Console` in action, install the 
 [dotnet-example](https://github.com/patriksvensson/dotnet-example)
 global tool.
 
@@ -107,34 +55,18 @@ Now you can list available examples in this repository:
 
 ```
 > dotnet example
-
-╭────────────┬───────────────────────────────────────┬──────────────────────────────────────────────────────╮
-│ Name       │ Path                                  │ Description                                          │
-├────────────┼───────────────────────────────────────┼──────────────────────────────────────────────────────┤
-│ Borders    │ examples/Borders/Borders.csproj       │ Demonstrates the different kind of borders.          │
-│ Calendars  │ examples/Calendars/Calendars.csproj   │ Demonstrates how to render calendars.                │
-│ Colors     │ examples/Colors/Colors.csproj         │ Demonstrates how to use colors in the console.       │
-│ Columns    │ examples/Columns/Columns.csproj       │ Demonstrates how to render data into columns.        │
-│ Emojis     │ examples/Emojis/Emojis.csproj         │ Demonstrates how to render emojis.                   │
-│ Exceptions │ examples/Exceptions/Exceptions.csproj │ Demonstrates how to render formatted exceptions.     │
-│ Grids      │ examples/Grids/Grids.csproj           │ Demonstrates how to render grids in a console.       │
-│ Info       │ examples/Info/Info.csproj             │ Displays the capabilities of the current console.    │
-│ Links      │ examples/Links/Links.csproj           │ Demonstrates how to render links in a console.       │
-│ Panels     │ examples/Panels/Panels.csproj         │ Demonstrates how to render items in panels.          │
-│ Rules      │ examples/Rules/Rules.csproj           │ Demonstrates how to render horizontal rules (lines). │
-│ Tables     │ examples/Tables/Tables.csproj         │ Demonstrates how to render tables in a console.      │
-╰────────────┴───────────────────────────────────────┴──────────────────────────────────────────────────────╯
 ```
 
 And to run an example:
 
 ```
 > dotnet example tables
-┌──────────┬──────────┬────────┐
-│ Foo      │ Bar      │ Baz    │
-├──────────┼──────────┼────────┤
-│ Hello    │ World!   │        │
-│ Bonjour  │ le       │ monde! │
-│ Hej      │ Världen! │        │
-└──────────┴──────────┴────────┘
-```
\ No newline at end of file
+```
+
+## License
+
+Copyright © Spectre Systems.
+
+Spectre.Console is provided as-is under the MIT license. For more information see LICENSE.
+
+* For SixLabors.ImageSharp, see https://github.com/SixLabors/ImageSharp/blob/master/LICENSE
\ No newline at end of file
diff --git a/examples/Canvas/Canvas.csproj b/examples/Canvas/Canvas.csproj
new file mode 100644
index 0000000..a98bd15
--- /dev/null
+++ b/examples/Canvas/Canvas.csproj
@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <IsPackable>false</IsPackable>
+    <Title>Canvas</Title>
+    <Description>Demonstrates how to render pixels and images.</Description>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj" />
+    <ProjectReference Include="..\..\src\Spectre.Console\Spectre.Console.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Update="cake.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+</Project>
diff --git a/examples/Canvas/Mandelbrot.cs b/examples/Canvas/Mandelbrot.cs
new file mode 100644
index 0000000..7f3a3da
--- /dev/null
+++ b/examples/Canvas/Mandelbrot.cs
@@ -0,0 +1,87 @@
+/*
+Ported from: https://rosettacode.org/wiki/Mandelbrot_set#C.23
+Licensed under GNU Free Documentation License 1.2
+*/
+
+using System;
+using Spectre.Console;
+
+namespace CanvasExample
+{
+    public static class Mandelbrot
+    {
+        private const double MaxValueExtent = 2.0;
+
+        private struct ComplexNumber
+        {
+            public double Real { get; }
+            public double Imaginary { get; }
+
+            public ComplexNumber(double real, double imaginary)
+            {
+                Real = real;
+                Imaginary = imaginary;
+            }
+
+            public static ComplexNumber operator +(ComplexNumber x, ComplexNumber y)
+            {
+                return new ComplexNumber(x.Real + y.Real, x.Imaginary + y.Imaginary);
+            }
+
+            public static ComplexNumber operator *(ComplexNumber x, ComplexNumber y)
+            {
+                return new ComplexNumber(x.Real * y.Real - x.Imaginary * y.Imaginary,
+                    x.Real * y.Imaginary + x.Imaginary * y.Real);
+            }
+
+            public double Abs()
+            {
+                return Real * Real + Imaginary * Imaginary;
+            }
+        }
+
+        public static Canvas Generate(int width, int height)
+        {
+            var canvas = new Canvas(width, height);
+
+            var scale = 2 * MaxValueExtent / Math.Min(canvas.Width, canvas.Height);
+            for (var i = 0; i < canvas.Height; i++)
+            {
+                var y = (canvas.Height / 2 - i) * scale;
+                for (var j = 0; j < canvas.Width; j++)
+                {
+                    var x = (j - canvas.Width / 2) * scale;
+                    var value = Calculate(new ComplexNumber(x, y));
+                    canvas.SetPixel(j, i, GetColor(value));
+                }
+            }
+
+            return canvas;
+        }
+
+        private static double Calculate(ComplexNumber c)
+        {
+            const int MaxIterations = 1000;
+            const double MaxNorm = MaxValueExtent * MaxValueExtent;
+
+            var iteration = 0;
+            var z = new ComplexNumber();
+            do
+            {
+                z = z * z + c;
+                iteration++;
+            } while (z.Abs() < MaxNorm && iteration < MaxIterations);
+
+            return iteration < MaxIterations
+                ? (double)iteration / MaxIterations
+                : 0;
+        }
+
+        private static Color GetColor(double value)
+        {
+            const double MaxColor = 256;
+            const double ContrastValue = 0.2;
+            return new Color(0, 0, (byte)(MaxColor * Math.Pow(value, ContrastValue)));
+        }
+    }
+}
diff --git a/examples/Canvas/Program.cs b/examples/Canvas/Program.cs
new file mode 100644
index 0000000..337961d
--- /dev/null
+++ b/examples/Canvas/Program.cs
@@ -0,0 +1,36 @@
+using SixLabors.ImageSharp.Processing;
+using Spectre.Console;
+using Spectre.Console.Rendering;
+
+namespace CanvasExample
+{
+    public static class Program
+    {
+        public static void Main()
+        {
+            // Draw a mandelbrot set using a Canvas
+            var mandelbrot = Mandelbrot.Generate(32, 32);
+            Render(mandelbrot, "Mandelbrot");
+
+            // Draw an image using CanvasImage powered by ImageSharp.
+            // This requires the "Spectre.Console.ImageSharp" NuGet package.
+            var image = new CanvasImage("cake.png");
+            image.BilinearResampler();
+            image.MaxWidth(16);
+            Render(image, "Image from file (16 wide)");
+
+            // Draw image again, but without render width
+            image.NoMaxWidth();
+            image.Mutate(ctx => ctx.Grayscale().Rotate(-45).EntropyCrop());
+            Render(image, "Image from file (fit, greyscale, rotated)");
+        }
+
+        private static void Render(IRenderable canvas, string title)
+        {
+            AnsiConsole.WriteLine();
+            AnsiConsole.Render(new Rule($"[yellow]{title}[/]").LeftAligned().RuleStyle("grey"));
+            AnsiConsole.WriteLine();
+            AnsiConsole.Render(canvas);
+        }
+    }
+}
diff --git a/examples/Canvas/cake.png b/examples/Canvas/cake.png
new file mode 100644
index 0000000000000000000000000000000000000000..f11d285c9463d14b1c4250457fe2a358678392a7
GIT binary patch
literal 52832
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%0AR{LQqrz*;V=tn8)n&-xSpEi6st^OJ
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

literal 0
HcmV?d00001

diff --git a/examples/Rules/Program.cs b/examples/Rules/Program.cs
index e65ac97..8a03924 100644
--- a/examples/Rules/Program.cs
+++ b/examples/Rules/Program.cs
@@ -7,34 +7,34 @@ namespace EmojiExample
         public static void Main(string[] args)
         {
             // No title
-            WrapInPanel(
+            Render(
                 new Rule()
                     .RuleStyle(Style.Parse("yellow"))
                     .AsciiBorder()
                     .LeftAligned());
 
             // Left aligned title
-            WrapInPanel(
+            Render(
                 new Rule("[blue]Left aligned[/]")
                     .RuleStyle(Style.Parse("red"))
                     .DoubleBorder()
                     .LeftAligned());
 
             // Centered title
-            WrapInPanel(
+            Render(
                 new Rule("[green]Centered[/]")
                     .RuleStyle(Style.Parse("green"))
                     .HeavyBorder()
                     .Centered());
 
             // Right aligned title
-            WrapInPanel(
+            Render(
                 new Rule("[red]Right aligned[/]")
                     .RuleStyle(Style.Parse("blue"))
                     .RightAligned());
         }
 
-        private static void WrapInPanel(Rule rule)
+        private static void Render(Rule rule)
         {
             AnsiConsole.Render(rule);
             AnsiConsole.WriteLine();
diff --git a/src/Spectre.Console.ImageSharp/CanvasImage.cs b/src/Spectre.Console.ImageSharp/CanvasImage.cs
new file mode 100644
index 0000000..fdf4bea
--- /dev/null
+++ b/src/Spectre.Console.ImageSharp/CanvasImage.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Collections.Generic;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Processing;
+using SixLabors.ImageSharp.Processing.Processors.Transforms;
+using Spectre.Console.Rendering;
+
+namespace Spectre.Console
+{
+    /// <summary>
+    /// Represents a renderable image.
+    /// </summary>
+    public sealed class CanvasImage : Renderable
+    {
+        private static readonly IResampler _defaultResampler = KnownResamplers.Bicubic;
+
+        /// <summary>
+        /// Gets the image width.
+        /// </summary>
+        public int Width => Image.Width;
+
+        /// <summary>
+        /// Gets the image height.
+        /// </summary>
+        public int Height => Image.Height;
+
+        /// <summary>
+        /// Gets or sets the render width of the canvas.
+        /// </summary>
+        public int? MaxWidth { get; set; }
+
+        /// <summary>
+        /// Gets or sets the render width of the canvas.
+        /// </summary>
+        public int PixelWidth { get; set; } = 2;
+
+        /// <summary>
+        /// Gets or sets the <see cref="IResampler"/> that should
+        /// be used when scaling the image. Defaults to bicubic sampling.
+        /// </summary>
+        public IResampler? Resampler { get; set; }
+
+        internal SixLabors.ImageSharp.Image<Rgba32> Image { get; }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="CanvasImage"/> class.
+        /// </summary>
+        /// <param name="filename">The image filename.</param>
+        public CanvasImage(string filename)
+        {
+            Image = SixLabors.ImageSharp.Image.Load<Rgba32>(filename);
+        }
+
+        /// <inheritdoc/>
+        protected override Measurement Measure(RenderContext context, int maxWidth)
+        {
+            if (PixelWidth < 0)
+            {
+                throw new InvalidOperationException("Pixel width must be greater than zero.");
+            }
+
+            var width = MaxWidth ?? Width;
+            if (maxWidth < width * PixelWidth)
+            {
+                return new Measurement(maxWidth, maxWidth);
+            }
+
+            return new Measurement(width * PixelWidth, width * PixelWidth);
+        }
+
+        /// <inheritdoc/>
+        protected override IEnumerable<Segment> Render(RenderContext context, int maxWidth)
+        {
+            var image = Image;
+
+            var width = Width;
+            var height = Height;
+
+            // Got a max width?
+            if (MaxWidth != null)
+            {
+                height = (int)(height * ((float)MaxWidth.Value) / Width);
+                width = MaxWidth.Value;
+            }
+
+            // Exceed the max width when we take pixel width into account?
+            if (width * PixelWidth > maxWidth)
+            {
+                height = (int)(height * (maxWidth / (float)(width * PixelWidth)));
+                width = maxWidth / PixelWidth;
+            }
+
+            // Need to rescale the pixel buffer?
+            if (width != Width || height != Height)
+            {
+                var resampler = Resampler ?? _defaultResampler;
+                image = image.Clone(); // Clone the original image
+                image.Mutate(i => i.Resize(width, height, resampler));
+            }
+
+            var canvas = new Canvas(width, height)
+            {
+                MaxWidth = MaxWidth,
+                PixelWidth = PixelWidth,
+                Scale = false,
+            };
+
+            for (var y = 0; y < image.Height; y++)
+            {
+                for (var x = 0; x < image.Width; x++)
+                {
+                    if (image[x, y].A == 0)
+                    {
+                        continue;
+                    }
+
+                    canvas.SetPixel(x, y, new Color(
+                        image[x, y].R, image[x, y].G, image[x, y].B));
+                }
+            }
+
+            return ((IRenderable)canvas).Render(context, maxWidth);
+        }
+    }
+}
diff --git a/src/Spectre.Console.ImageSharp/CanvasImageExtensions.cs b/src/Spectre.Console.ImageSharp/CanvasImageExtensions.cs
new file mode 100644
index 0000000..fa99fe6
--- /dev/null
+++ b/src/Spectre.Console.ImageSharp/CanvasImageExtensions.cs
@@ -0,0 +1,135 @@
+using System;
+using SixLabors.ImageSharp.Processing;
+
+namespace Spectre.Console
+{
+    /// <summary>
+    /// Contains extension methods for <see cref="CanvasImage"/>.
+    /// </summary>
+    public static class CanvasImageExtensions
+    {
+        /// <summary>
+        /// Sets the maximum width of the rendered image.
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <param name="maxWidth">The maximum width.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage MaxWidth(this CanvasImage image, int? maxWidth)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            image.MaxWidth = maxWidth;
+            return image;
+        }
+
+        /// <summary>
+        /// Disables the maximum width of the rendered image.
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage NoMaxWidth(this CanvasImage image)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            image.MaxWidth = null;
+            return image;
+        }
+
+        /// <summary>
+        /// Sets the pixel width.
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <param name="width">The pixel width.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage PixelWidth(this CanvasImage image, int width)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            image.PixelWidth = width;
+            return image;
+        }
+
+        /// <summary>
+        /// Mutates the underlying image.
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <param name="action">The action that mutates the underlying image.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage Mutate(this CanvasImage image, Action<IImageProcessingContext> action)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            if (action is null)
+            {
+                throw new ArgumentNullException(nameof(action));
+            }
+
+            image.Image.Mutate(action);
+            return image;
+        }
+
+        /// <summary>
+        /// Uses a bicubic sampler that implements the bicubic kernel algorithm W(x).
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage BicubicResampler(this CanvasImage image)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            image.Resampler = KnownResamplers.Bicubic;
+            return image;
+        }
+
+        /// <summary>
+        /// Uses a bilinear sampler. This interpolation algorithm
+        /// can be used where perfect image transformation with pixel matching is impossible,
+        /// so that one can calculate and assign appropriate intensity values to pixels.
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage BilinearResampler(this CanvasImage image)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            image.Resampler = KnownResamplers.Triangle;
+            return image;
+        }
+
+        /// <summary>
+        /// Uses a Nearest-Neighbour sampler that implements the nearest neighbor algorithm.
+        /// This uses a very fast, unscaled filter which will select the closest pixel to
+        /// the new pixels position.
+        /// </summary>
+        /// <param name="image">The canvas image.</param>
+        /// <returns>The same instance so that multiple calls can be chained.</returns>
+        public static CanvasImage NearestNeighborResampler(this CanvasImage image)
+        {
+            if (image is null)
+            {
+                throw new ArgumentNullException(nameof(image));
+            }
+
+            image.Resampler = KnownResamplers.NearestNeighbor;
+            return image;
+        }
+    }
+}
diff --git a/src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj b/src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj
new file mode 100644
index 0000000..f5c18ad
--- /dev/null
+++ b/src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj
@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netstandard2.0</TargetFrameworks>
+    <Nullable>enable</Nullable>
+    <Description>A library that extends Spectre.Console with ImageSharp super powers.</Description>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <AdditionalFiles Include="..\stylecop.json" Link="Properties/stylecop.json" />
+    <None Include="../../resources/gfx/small-logo.png" Pack="true" PackagePath="\" Link="Properties/small-logo.png" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="SixLabors.ImageSharp" Version="1.0.2" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Spectre.Console\Spectre.Console.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/Spectre.Console.sln b/src/Spectre.Console.sln
index c9a4ba3..a1af2ed 100644
--- a/src/Spectre.Console.sln
+++ b/src/Spectre.Console.sln
@@ -54,6 +54,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Prompt", "..\examples\Promp
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Figlet", "..\examples\Figlet\Figlet.csproj", "{45BF6302-6553-4E52-BF0F-B10D1AA9A6D1}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Canvas", "..\examples\Canvas\Canvas.csproj", "{5693761A-754A-40A8-9144-36510D6A4D69}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.ImageSharp", "Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj", "{0EFE694D-0770-4E71-BF4E-EC2B41362F79}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -268,6 +272,30 @@ Global
 		{45BF6302-6553-4E52-BF0F-B10D1AA9A6D1}.Release|x64.Build.0 = Release|Any CPU
 		{45BF6302-6553-4E52-BF0F-B10D1AA9A6D1}.Release|x86.ActiveCfg = Release|Any CPU
 		{45BF6302-6553-4E52-BF0F-B10D1AA9A6D1}.Release|x86.Build.0 = Release|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Debug|x64.Build.0 = Debug|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Debug|x86.Build.0 = Debug|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Release|x64.ActiveCfg = Release|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Release|x64.Build.0 = Release|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Release|x86.ActiveCfg = Release|Any CPU
+		{5693761A-754A-40A8-9144-36510D6A4D69}.Release|x86.Build.0 = Release|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Debug|x64.Build.0 = Debug|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Debug|x86.Build.0 = Debug|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Release|x64.ActiveCfg = Release|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Release|x64.Build.0 = Release|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Release|x86.ActiveCfg = Release|Any CPU
+		{0EFE694D-0770-4E71-BF4E-EC2B41362F79}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -289,6 +317,7 @@ Global
 		{75C608C3-ABB4-4168-A229-7F8250B946D1} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
 		{6351C70F-F368-46DB-BAED-9B87CCD69353} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
 		{45BF6302-6553-4E52-BF0F-B10D1AA9A6D1} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
+		{5693761A-754A-40A8-9144-36510D6A4D69} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5729B071-67A0-48FB-8B1B-275E6822086C}
diff --git a/src/Spectre.Console/Widgets/Canvas.cs b/src/Spectre.Console/Widgets/Canvas.cs
new file mode 100644
index 0000000..acad4ce
--- /dev/null
+++ b/src/Spectre.Console/Widgets/Canvas.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Collections.Generic;
+using Spectre.Console.Rendering;
+
+namespace Spectre.Console
+{
+    /// <summary>
+    /// Represents a renderable canvas.
+    /// </summary>
+    public sealed class Canvas : Renderable
+    {
+        private readonly Color?[,] _pixels;
+
+        /// <summary>
+        /// Gets the width of the canvas.
+        /// </summary>
+        public int Width { get; }
+
+        /// <summary>
+        /// Gets the height of the canvas.
+        /// </summary>
+        public int Height { get; }
+
+        /// <summary>
+        /// Gets or sets the render width of the canvas.
+        /// </summary>
+        public int? MaxWidth { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether or not
+        /// to scale the canvas when rendering.
+        /// </summary>
+        public bool Scale { get; set; } = true;
+
+        /// <summary>
+        /// Gets or sets the pixel width.
+        /// </summary>
+        public int PixelWidth { get; set; } = 2;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Canvas"/> class.
+        /// </summary>
+        /// <param name="width">The canvas width.</param>
+        /// <param name="height">The canvas height.</param>
+        public Canvas(int width, int height)
+        {
+            Width = width;
+            Height = height;
+
+            _pixels = new Color?[Width, Height];
+        }
+
+        /// <summary>
+        /// Sets a pixel with the specified color in the canvas at the specified location.
+        /// </summary>
+        /// <param name="x">The X coordinate for the pixel.</param>
+        /// <param name="y">The Y coordinate for the pixel.</param>
+        /// <param name="color">The pixel color.</param>
+        public void SetPixel(int x, int y, Color color)
+        {
+            _pixels[x, y] = color;
+        }
+
+        /// <inheritdoc/>
+        protected override Measurement Measure(RenderContext context, int maxWidth)
+        {
+            if (PixelWidth < 0)
+            {
+                throw new InvalidOperationException("Pixel width must be greater than zero.");
+            }
+
+            var width = MaxWidth ?? Width;
+
+            if (maxWidth < width * PixelWidth)
+            {
+                return new Measurement(maxWidth, maxWidth);
+            }
+
+            return new Measurement(width * PixelWidth, width * PixelWidth);
+        }
+
+        /// <inheritdoc/>
+        protected override IEnumerable<Segment> Render(RenderContext context, int maxWidth)
+        {
+            if (PixelWidth < 0)
+            {
+                throw new InvalidOperationException("Pixel width must be greater than zero.");
+            }
+
+            var pixels = _pixels;
+            var pixel = new string(' ', PixelWidth);
+            var width = Width;
+            var height = Height;
+
+            // Got a max width?
+            if (MaxWidth != null)
+            {
+                height = (int)(height * ((float)MaxWidth.Value) / Width);
+                width = MaxWidth.Value;
+            }
+
+            // Exceed the max width when we take pixel width into account?
+            if (width * PixelWidth > maxWidth)
+            {
+                height = (int)(height * (maxWidth / (float)(width * PixelWidth)));
+                width = maxWidth / PixelWidth;
+            }
+
+            // Need to rescale the pixel buffer?
+            if (Scale && (width != Width || height != Height))
+            {
+                pixels = ScaleDown(width, height);
+            }
+
+            for (var y = 0; y < height; y++)
+            {
+                for (var x = 0; x < width; x++)
+                {
+                    var color = pixels[x, y];
+                    if (color != null)
+                    {
+                        yield return new Segment(pixel, new Style(background: color));
+                    }
+                    else
+                    {
+                        yield return new Segment(pixel);
+                    }
+                }
+
+                yield return Segment.LineBreak;
+            }
+        }
+
+        private Color?[,] ScaleDown(int newWidth, int newHeight)
+        {
+            var buffer = new Color?[newWidth, newHeight];
+            var xRatio = ((Width << 16) / newWidth) + 1;
+            var yRatio = ((Height << 16) / newHeight) + 1;
+
+            for (var i = 0; i < newHeight; i++)
+            {
+                for (var j = 0; j < newWidth; j++)
+                {
+                    buffer[j, i] = _pixels[(j * xRatio) >> 16, (i * yRatio) >> 16];
+                }
+            }
+
+            return buffer;
+        }
+    }
+}