C # Билинейная интерполяция RGB - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь реализовать билинейную интерполяцию в 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);
        }

Может кто-нибудь помочь мне найти проблему с алгоритмом!

...