ImageSharp is a new, fully featured, fully managed, cross-platform, 2D graphics API designed to allow the processing of images without the use of System.Drawing
.
Built against .Net Standard 1.1 ImageSharp can be used in device, cloud, and embedded/IoT scenarios.
ImageSharp has made excellent progress and contains many great features but is still considered by us to be still in early stages (alpha). As such, we cannot support its use on production environments until the library reaches release candidate status.
Pre-release downloads are available from the MyGet package repository.
Build Status | Code Coverage | |
---|---|---|
Linux/Mac | ||
Windows |
At present the code is pre-release but when ready it will be available on Nuget.
Pre-release downloads
We already have a MyGet package repository - for bleeding-edge / development NuGet releases.
The ImageSharp library is made up of multiple packages.
Packages include:
-
ImageSharp
- Contains the generic
Image<TPixel>
class, PixelFormats, Primitives, Configuration, and other core functionality. - The
IImageFormat
interface, Jpeg, Png, Bmp, and Gif formats. - Transform methods like Resize, Crop, Skew, Rotate - Anything that alters the dimensions of the image.
- Non-transform methods like Gaussian Blur, Pixelate, Edge Detection - Anything that maintains the original image dimensions.
- Contains the generic
-
ImageSharp.Drawing
- Brushes and various drawing algorithms, including drawing images.
- Various vector drawing methods for drawing paths, polygons etc.
- Text drawing.
If you prefer, you can compile ImageSharp yourself (please do and help!), you'll need:
- Visual Studio 2017 (or above)
- The .NET Core SDK Installer - Non VSCode link.
Alternatively on Linux you can use:
To clone it locally click the "Clone in Windows" button above or run the following git commands.
git clone https://github.com/JimBobSquarePants/ImageSharp
There's plenty there and more coming. Check out the current features!
Without the constraints of System.Drawing
We have been able to develop something much more flexible, easier to code against, and much, much less prone to memory leaks.
Gone are system-wide process-locks; ImageSharp images are thread-safe and fully supported in web environments.
Many Image<TPixel>
methods are also fluent.
Here's an example of the code required to resize an image using the default Bicubic resampler then turn the colors into their grayscale equivalent using the BT709 standard matrix.
Rgba32
is our default PixelFormat, equivalent to System.Drawing Color
.
On platforms supporting netstandard 1.3+
// Image.Load(string path) is a shortcut for our default type. Other pixel formats use Image.Load<TPixel>(string path))
using (Image<Rgba32> image = Image.Load("foo.jpg"))
{
image.Resize(image.Width / 2, image.Height / 2)
.Grayscale()
.Save("bar.jpg"); // automatic encoder selected based on extension.
}
on netstandard 1.1 - 1.2
// Image.Load(Stream stream) is a shortcut for our default type. Other pixel formats use Image.Load<TPixel>(Stream stream))
using (FileStream stream = File.OpenRead("foo.jpg"))
using (FileStream output = File.OpenWrite("bar.jpg"))
using (Image<Rgba32> image = Image.Load<Rgba32>(stream))
{
image.Resize(image.Width / 2, image.Height / 2)
.Grayscale()
.Save(output);
}
Setting individual pixel values can be perfomed as follows:
// Individual pixels
using (Image<Rgba32> image = new Image<Rgba32>(400, 400))
{
image[200, 200] = Rgba32.White;
}
For optimized access within a loop it is recommended that the following methods are used.
image.GetRowSpan(y)
image.GetRowSpan(x, y)
For advanced pixel format usage there are multiple PixelFormat implementations available allowing developers to implement their own color models in the same manner as Microsoft XNA Game Studio and MonoGame.
All in all this should allow image processing to be much more accessible to developers which has always been my goal from the start.
Please... Spread the word, contribute algorithms, submit performance improvements, unit tests.
Performance is a biggie, if you know anything about the System.Numerics.Vectors
types and can apply some fancy new stuff with that it would be awesome.
There's a lot of developers out there who could write this stuff a lot better and faster than I and I would love to see what we collectively can come up with so please, if you can help in any way it would be most welcome and benificial for all.
Grand High Eternal Dictator
Core Team
Support us with a monthly donation and help us continue our activities. [Become a backer]
Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]