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

TiltShift() public method

Tilt shift filtration
public TiltShift ( Bitmap OriginalImage ) : Bitmap
OriginalImage System.Drawing.Bitmap Original ARGB image
return System.Drawing.Bitmap
        public Bitmap TiltShift(Bitmap OriginalImage)
        {
            int M = OriginalImage.Width;
            int N = OriginalImage.Height;

            Bitmap tilt = new Bitmap(M, N);

            int N1 = (int)(N / 2);
            int N2 = (int)(N1 + N1 / 2);

            for (int i = 0; i < M; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    if (j >= N1 && j <= N2)
                    {
                        tilt.SetPixel(i, j, OriginalImage.GetPixel(i, j));
                    }
                    else if (j < N1)
                    {
                        Double sigma = 0.1 + (6 - 0.1) * Convert.ToDouble(N1 - j) / Convert.ToDouble(N1);

                        List<Double> Filter = new List<double>();

                        for (int k = 0; k < 1000; k++)
                        {
                            Double K = Convert.ToDouble(k);
                            Double gauss = (1 / (Math.Sqrt(2 * Math.PI) * sigma)) * Math.Exp(-K * K / (2 * sigma * sigma));

                            if (gauss < 0.003)
                            {
                                break;
                            }
                            else
                            {
                                Filter.Add(gauss);
                            }
                        }

                        Double licznikR = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).R);
                        Double licznikG = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).G);
                        Double licznikB = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).B);

                        Double mianownik = Filter[0];

                        for (int a = 1; a < Filter.Count; a++)
                        {

                            mianownik += 2 * Filter[a];

                        }

                        for (int b = 1; b < Filter.Count; b++)
                        {

                            int x = i;
                            int y1 = j - b;
                            int y2 = j + b;

                            if (y1 < 0)
                            {
                                y1 = Math.Abs(y1);
                            }
                            else if (y2 >= N)
                            {
                                y2 = y2 + b - N + 1;
                            }
                            else
                            {

                                licznikR += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).R) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).R));
                                licznikG += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).G) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).G));
                                licznikB += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).B) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).B));

                            }

                        }

                        int newR = (int)(licznikR / mianownik);
                        int newG = (int)(licznikG / mianownik);
                        int newB = (int)(licznikB / mianownik);

                        if (newR > 255) newR = 255; if (newR < 0) newR = 0;
                        if (newG > 255) newG = 255; if (newG < 0) newG = 0;
                        if (newB > 255) newB = 255; if (newB < 0) newB = 0;

                        tilt.SetPixel(i, j, Color.FromArgb(255, newR, newG, newB));

                    }
                    else if (j > N2)
                    {
                        Double sigma = 0.1 + (6 - 0.1) * Convert.ToDouble(j - N2) / Convert.ToDouble(N1);

                        List<Double> Filter = new List<double>();

                        for (int k = 0; k < 1000; k++)
                        {
                            Double K = Convert.ToDouble(k);
                            Double gauss = (1 / (Math.Sqrt(2 * Math.PI) * sigma)) * Math.Exp(-K * K / (2 * sigma * sigma));

                            if (gauss < 0.003)
                            {
                                break;
                            }
                            else
                            {
                                Filter.Add(gauss);
                            }
                        }

                        Double licznikR = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).R);
                        Double licznikG = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).G);
                        Double licznikB = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).B);

                        Double mianownik = Filter[0];

                        for (int a = 1; a < Filter.Count; a++)
                        {

                            mianownik += 2 * Filter[a];

                        }

                        for (int b = 1; b < Filter.Count; b++)
                        {

                            int x = i;
                            int y1 = j - b;
                            int y2 = j + b;

                            if (y1 < 0)
                            {
                                y1 = Math.Abs(y1);
                            }
                            else if (y2 >= N)
                            {
                                y2 = y2 + b - N + 1;
                            }
                            else
                            {

                                licznikR += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).R) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).R));
                                licznikG += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).G) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).G));
                                licznikB += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).B) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).B));

                            }

                        }

                        int newR = (int)(licznikR / mianownik);
                        int newG = (int)(licznikG / mianownik);
                        int newB = (int)(licznikB / mianownik);

                        if (newR > 255) newR = 255; if (newR < 0) newR = 0;
                        if (newG > 255) newG = 255; if (newG < 0) newG = 0;
                        if (newB > 255) newB = 255; if (newB < 0) newB = 0;

                        tilt.SetPixel(i, j, Color.FromArgb(255, newR, newG, newB));
                    }
                }
            }

            return tilt;
        }