📷 A modern, cross-platform, 2D Graphics library for .NET
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.
 
 
Jeavon 7aa4e92848 Add a nodejs script to patch the project.json file with the AppVeyor version number 10 years ago
build Add a nodejs script to patch the project.json file with the AppVeyor version number 10 years ago
src/ImageProcessor Adding netcore.platforms 10 years ago
tests/ImageProcessor.Tests Converting to a Class Library (Package) project - wow, this is a brave new world! 10 years ago
.gitattributes First Commit 14 years ago
.gitignore Add a nodejs script to patch the project.json file with the AppVeyor version number 10 years ago
APACHE-2.0-LICENSE.txt Async optimisation complete. 13 years ago
ImageProcessor.sln Converting to a Class Library (Package) project - wow, this is a brave new world! 10 years ago
ImageProcessor.sln.DotSettings Stylecop fixes 10 years ago
README.md Update README.md 10 years ago
Settings.StyleCop Adding more structs and tests 11 years ago
global.json Missing global.json 10 years ago

README.md

ImageProcessor

This branch contains the new cross platform version of ImageProcessor.

This is a complete rewrite from the ground up to allow the processing of images without the use of System.Drawing using a portable class library (PCL). It's still in early stages but progress has been pretty quick.

###Why am I writing this?

With NETCore there is currently no version of System.Drawing to allow continued progress of the existing ImageProcessor library. Progress developing a crossplatform update are restricted to the CoreFXLab repo where progress seems to be very slow.

###Is this wise?

Honestly... I don't know. I could be writing code that may be suddenly obsolete. There has been little feedback on questions I've asked but it's a nice learning process if anything and I will definitely be releasing the code for consumption.

###What works so far/ What is planned?

  • Encoding/decoding of image formats (plugable)
  • jpeg (Includes progressive)
  • bmp (More bmp format saving support required, 24bit just now)
  • png (Need updating for saving indexed support)
  • gif
  • Basic color structs with implicit operators. Vector backed. Need help investigating premultiplication.
  • Color - Float based, No limit to r, g, b, a values allowing for a fuller color range.
  • BGRA32
  • CIE Lab
  • CIE XYZ
  • CMYK
  • HSV
  • HSLA
  • RGBAW
  • YCbCr
  • Basic shape primitives (Unfinished and could possible be updated by using Vector2, Vector3, etc)
  • Rectangle
  • Size
  • Point
  • Sphere
  • Resampling algorithms. (Performance improvements?)
  • Box
  • Bicubic
  • Lanczos3
  • Lanczos5
  • Lanczos8
  • MitchelNetravali
  • Nearest Neighbour
  • Robidoux
  • Robidoux Sharp
  • Robidoux Soft
  • Spline
  • Triangle
  • Welch
  • Cropping
  • Rectangular Crop
  • Elliptical Crop
  • Entropy Crop
  • Rotation
  • Flip (90, 270, FlipType etc. Need help)
  • Rotate by angle (Need help)
  • ColorMatrix operations (Uses Matrix4x4)
  • BlackWhite
  • Greyscale BT709
  • Greyscale BT601
  • Lomograph
  • Polaroid
  • Kodachrome
  • Sepia
  • Edge Detection
  • Kayyali
  • Kirsch
  • Laplacian3X3
  • Laplacian5X5
  • LaplacianOfGaussian
  • Prewitt
  • RobertsCross
  • Scharr
  • Sobel
  • Blurring/ Sharpening
  • Gaussian blur
  • Gaussian sharpening
  • Box Blur
  • Filters
  • Alpha
  • Contrast
  • Invert
  • Brightness
  • Saturation
  • Hue
  • Blend
  • Mask
  • Effects
  • Pattern brushes (Need help)
  • Elliptical brushes (Need help)
  • Gradient brush (vignette? Need help)
  • Other stuff I haven't thought of.

###What might never happen

  • Exif manipulation - There's a lot of quirks in parsing EXIF and I'd need a ton of help to get it all coded.
  • Font support (Depends on new System.Text stuff) I don't know where to start coding this so if you have any pointers please chip in.

###API Changes

With this version the API will change dramatically. Without the constraints of System.Drawing I have been able to develop something much more flexible, easier to code against, and much, much less prone to memory leaks. Gone are using image classes which implements IDisposable, Gone are system wide proces locks with Images and processors thread safe usable in parallel processing utilizing all the availables cores.

Image methods are also fluent which allow chaining much like the ImageFactory class in V2 and below.

Here's an example of the code required to resize an image using the default Robidoux resampler then turn the colors into their greyscale equivalent using the BT709 standard matrix.

using (FileStream stream = File.OpenRead("foo.jpg"))
{
    Image image = new Image(stream);
    using (FileStream output = File.OpenWrite("bar.jpg"))
    {
        image.Resize(image.Width / 2, image.Height / 2)
             .Greyscale()
             .Save(output);
    }
}

It will also be possible to pass collections of processors as params to manipulate images. For example here I am applying a Gaussian blur with a sigma of 5 to an image, then detecting the edges using a Sobel operator working in greyscale mode.

using (FileStream stream = File.OpenRead("foo.jpg"))
{
    Image image = new Image(stream);
    using (FileStream output = File.OpenWrite("bar.jpg"))
    {
        List<IImageProcessor> processors = new List<IImageProcessor>()
        {
            new GuassianBlur(5),
            new Sobel { Greyscale = true }
        };

        image.Process(processors.ToArray())
             .Save(output);
    }
}

Individual processors can be initialised and apply processing against images. This allows nesting which will allow the powerful combination of processing methods:

new Brightness(50).Apply(sourceImage, targetImage, sourceImage.Bounds);

All in all this should allow image processing to be much more accessible to developers which has always been my goal from the start.

###How can you help?

Please... Spread the word, contribute algorithms, submit performance improvements, unit tests. Help me set up CI for nightly releases.

Performance is a biggie, if you know anything about the new vector 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.