LitDev.Engines.FIP.Resize2 C# (CSharp) Method

Resize2() public method

Image resize using bilinear interpolation method
public Resize2 ( Bitmap OriginalImage, int Width, int Height ) : Bitmap
OriginalImage System.Drawing.Bitmap Original image
Width int Output width
Height int Output height
return System.Drawing.Bitmap
        public Bitmap Resize2(Bitmap OriginalImage, int Width, int Height)
        {
            if (Width <= 0 || Height <= 0)
            {
                throw new Exception("Output image width and height must be positive");
            }

            Bitmap OutputImage = new System.Drawing.Bitmap(Width, Height);

            Double rh = Convert.ToDouble(OriginalImage.Width) / Convert.ToDouble(Width);
            Double rv = Convert.ToDouble(OriginalImage.Height) / Convert.ToDouble(Height);

            for (int x = 0; x < Width; x++)
            {
                for (int y = 0; y < Height; y++)
                {

                    int m = (int)(x * rh);
                    int n = (int)(y * rv);

                    if (m >= OriginalImage.Width) m = OriginalImage.Width - 1;
                    if (n >= OriginalImage.Height) n = OriginalImage.Height - 1;

                    Double a = (x * rh) % m;
                    Double b = (y * rv) % n;

                    if (double.IsNaN(a))
                    {
                        a = 0;
                    }

                    if (double.IsNaN(b))
                    {
                        b = 0;
                    }

                    int m1 = m + 1;
                    int n1 = n + 1;

                    if (m1 >= OriginalImage.Width) m1 = m;
                    if (n1 >= OriginalImage.Height) n1 = n;

                    int red = 0, green = 0, blue = 0;

                    // horizontal
                    Color pixel00 = OriginalImage.GetPixel(m, n);
                    Color pixel10 = OriginalImage.GetPixel(m1, n);

                    // vertical
                    Color pixel01 = OriginalImage.GetPixel(m, n1);
                    Color pixel11 = OriginalImage.GetPixel(m1, n1);

                    // Red

                    Double Fa0R = (1 - a) * pixel00.R + a * pixel10.R;
                    Double Fa1R = (1 - a) * pixel01.R + a * pixel11.R;

                    Double FabR = (1 - b) * Fa0R + b * Fa1R;

                    red = (int)FabR;

                    if (red > 255) red = 255;
                    if (red < 0) red = 0;

                    // Green
                    Double Fa0G = (1 - a) * pixel00.G + a * pixel10.G;
                    Double Fa1G = (1 - a) * pixel01.G + a * pixel11.G;

                    Double FabG = (1 - b) * Fa0G + b * Fa1G;

                    green = (int)FabG;

                    if (green > 255) green = 255;
                    if (green < 0) green = 0;

                    // Blue
                    Double Fa0B = (1 - a) * pixel00.B + a * pixel10.B;
                    Double Fa1B = (1 - a) * pixel01.B + a * pixel11.B;

                    Double FabB = (1 - b) * Fa0B + b * Fa1B;

                    blue = (int)FabB;

                    if (blue > 255) blue = 255;
                    if (blue < 0) blue = 0;

                    OutputImage.SetPixel(x, y, Color.FromArgb(255, red, green, blue));
                }
            }

            return OutputImage;
        }