// -------------------------------------------------------------------------------------------------------------------- // // Copyright © James South and contributors. // Licensed under the Apache License, Version 2.0. // // // The base class of all images. Encapsulates all the properties and methods // required to manipulate images. // // -------------------------------------------------------------------------------------------------------------------- namespace ImageProcessor { using System; /// /// The base class of all images. Encapsulates the basic properties and methods /// required to manipulate images. /// public abstract class ImageBase { /// /// The maximum allowable width in pixels. /// private static int maxWidth = int.MaxValue; /// /// The maximum allowable height in pixels. /// private static int maxHeight = int.MaxValue; /// /// Initializes a new instance of the class. /// protected ImageBase() { } /// /// Initializes a new instance of the class. /// /// /// The width of the image in pixels. /// /// /// The height of the image in pixels. /// /// /// Thrown if either or are less than or equal to 0. /// protected ImageBase(int width, int height) { Guard.GreaterThan(width, 0, "width"); Guard.GreaterThan(height, 0, "height"); this.Width = width; this.Height = height; this.Pixels = new byte[width * height * 4]; } /// /// Initializes a new instance of the class. /// /// /// The other to create this instance from. /// /// /// Thrown if the given is null. /// protected ImageBase(ImageBase other) { Guard.NotNull(other, "other", "Other image cannot be null."); byte[] pixels = other.Pixels; this.Width = other.Width; this.Height = other.Height; this.Pixels = new byte[pixels.Length]; Array.Copy(pixels, this.Pixels, pixels.Length); } /// /// Gets or sets the maximum allowable width in pixels. /// public static int MaxWidth { get { return maxWidth; } set { maxWidth = value; } } /// /// Gets or sets the maximum allowable height in pixels. /// public static int MaxHeight { get { return maxHeight; } set { maxHeight = value; } } /// /// Gets the image pixels as byte array. /// /// /// The returned array has a length of Width * Height * 4 bytes /// and stores the blue, the green, the red and the alpha value for /// each pixel in this order. /// public byte[] Pixels { get; private set; } /// /// Gets the width in pixels. /// public int Width { get; private set; } /// /// Gets the height in pixels. /// public int Height { get; private set; } /// /// Gets the pixel ratio made up of the width and height. /// public double PixelRatio { get { return (double)this.Width / this.Height; } } /// /// Gets the representing the bounds of the image. /// public Rectangle Bounds { get { return new Rectangle(0, 0, this.Width, this.Height); } } /// /// Gets or sets the color of a pixel at the specified position. /// /// /// The x-coordinate of the pixel. Must be greater /// than zero and smaller than the width of the pixel. /// /// /// The y-coordinate of the pixel. Must be greater /// than zero and smaller than the width of the pixel. /// /// The at the specified position. public Color this[int x, int y] { get { #if DEBUG if ((x < 0) || (x >= this.Width)) { throw new ArgumentOutOfRangeException("x", "Value cannot be less than zero or greater than the bitmap width."); } if ((y < 0) || (y >= this.Width)) { throw new ArgumentOutOfRangeException("y", "Value cannot be less than zero or greater than the bitmap height."); } #endif int start = ((y * this.Width) + x) * 4; return new Color(this.Pixels[start], this.Pixels[start + 1], this.Pixels[start + 2], this.Pixels[start + 3]); } set { #if DEBUG if ((x < 0) || (x >= this.Width)) { throw new ArgumentOutOfRangeException("x", "Value cannot be less than zero or greater than the bitmap width."); } if ((y < 0) || (y >= this.Width)) { throw new ArgumentOutOfRangeException("y", "Value cannot be less than zero or greater than the bitmap height."); } #endif int start = ((y * this.Width) + x) * 4; this.Pixels[start + 0] = value.B; this.Pixels[start + 1] = value.G; this.Pixels[start + 2] = value.R; this.Pixels[start + 3] = value.A; } } /// /// Sets the pixel array of the image. /// /// /// The new width of the image. Must be greater than zero. /// The new height of the image. Must be greater than zero. /// /// The array with colors. Must be a multiple /// of four, width and height. /// /// /// Thrown if either or are less than or equal to 0. /// /// /// Thrown if the length is not equal to Width * Height * 4. /// public void SetPixels(int width, int height, byte[] pixels) { if (width <= 0) { throw new ArgumentOutOfRangeException("width", "Width must be greater than or equals than zero."); } if (height <= 0) { throw new ArgumentOutOfRangeException("height", "Height must be greater than or equal than zero."); } if (pixels.Length != width * height * 4) { throw new ArgumentException("Pixel array must have the length of Width * Height * 4."); } this.Width = width; this.Height = height; this.Pixels = pixels; } } }