Я пытаюсь реализовать билинейную интерполяцию в C #, используя значения RGB, но я для значений R, G, B большую часть времени получаю значения, превышающие 255, что нарушает логический курс.
Это мой код:
public static void ResizeImageBilinear(Color[,] inputImage, double scale)
{
int maxWidth = (int)(scale * inputImage.GetLength(0));
int maxHeight = (int)(scale * inputImage.GetLength(1));
Color[,] scaledImage = new Color[maxWidth, maxHeight];
for (int x = 0; x < scaledImage.GetLength(0); x++)
{
for (int y = 0; y < scaledImage.GetLength(1) - 1; y++)
{
//Gets current Pixel
double xDouble = (x / scale);
double yDouble = (y / scale);
int xInOriginal = (int)(Math.Floor(x / scale));
int yInOriginal = (int)(Math.Floor(y / scale));
double deltaR = xDouble - xInOriginal;
double deltaC = yDouble - yInOriginal;
Console.WriteLine(yInOriginal + " " + yDouble);
Color pixel = inputImage[xInOriginal, yInOriginal];
Color pixelN1 = inputImage[xInOriginal + 1, yInOriginal];
Color pixelN2 = inputImage[xInOriginal + 1, yInOriginal + 1];
Color pixelN3 = inputImage[xInOriginal, yInOriginal + 1];
int RValue = (int)(Math.Round(
pixel.R * (1 - deltaR) * (1 * deltaC) +
pixelN1.R * deltaR * (1 - deltaC) +
pixelN3.R * (1 - deltaR) * deltaC +
pixelN2.R * deltaR * deltaC));
int BValue = (int)(Math.Round(pixel.B * (1 - deltaR) * (1 * deltaC) +
pixelN1.B * deltaR * (1 - deltaC) +
pixelN3.B * (1 - deltaR) * deltaC +
pixelN2.B * deltaR * deltaC));
int GValue = (int)(Math.Round(pixel.G * (1 - deltaR) * (1 * deltaC) +
pixelN1.G * deltaR * (1 - deltaC) +
pixelN3.G * (1 - deltaR) * deltaC +
pixelN2.G * deltaR * deltaC));
Console.WriteLine(RValue + " " + GValue + " " + BValue);
Color newPixel = Color.FromArgb(RValue, GValue, BValue);
//Sets pixel in new image
scaledImage[x, y] = newPixel;
}
}
DrawImage(scaledImage);
}
Может кто-нибудь помочь мне найти проблему с алгоритмом!