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;
}