Конвертация из RGB в HSL

Всем добрый вечер. Писал код, при помощи которого можно было бы преобразовать RGB в HSL и разделить изображение собственно на 3 отдельных канала HSL, чтобы потом выводить по отдельности. Формулы собственно взяты из википедии, по идее должно быть правильно, хотя я конечно мог налажать с выводом изображений в picturebox. Но мне выводит ошибку: System.ArgumentException: “Значение ‘300’ недопустимо для ‘red’. ‘red’ должно быть больше или равно 0 и меньше или равно 255.”
А, если я, например, скрываю h, то выводятся как бы две картинки, чисто залитые черным цветом. Подскажите пожалуйста, как можно испраить.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TgaLib;
using System.IO;
namespace kursovKIT
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void firstimage_Click(object sender, EventArgs e)
        {

        }

        private void tgasave_Click(object sender, EventArgs e)
        {
            Image image = Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.jpg");
            string filename = Path.GetFileName("D:/Программы/kursovKIT/kursovKIT/image.jpg");
            image.Save("D:/Программы/kursovKIT/kursovKIT/image.tga");
            Image imagenew = Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga");
            firstimage.SizeMode = PictureBoxSizeMode.StretchImage;
            firstimage.Image = imagenew;

        }

        private void pcxsave_Click(object sender, EventArgs e)
        {
            Image image = Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga");
            image.Save("D:/Программы/kursovKIT/kursovKIT/image.pcx");
            MessageBox.Show("Сохранение выполнено успешно");
        }

        private void hls_Click(object sender, EventArgs e)
        {
            
            int i, j;
            var image = new Bitmap(firstimage.Image);
            Bitmap[] result = new Bitmap[] { new Bitmap(image.Width, image.Height), new Bitmap(image.Width, image.Height), new Bitmap(image.Width, image.Height) };
            int width = image.Width;
            int height = image.Height;
            byte[,] image_matr;
            image_matr = new byte[width,height];
            for (i = 0; i < width; i++)
            {
                for (j = 0; j < height; j++)
                {
                  
                    Color color = image.GetPixel(i, j);
                    int R = Convert.ToInt32(color.R)/255;
                    int G = Convert.ToInt32(color.G) / 255;
                    int B = Convert.ToInt32(color.B) / 255;
                    double max = Math.Max(R, Math.Max(G, B));
                    double min = Math.Min(R, Math.Min(G, B));
                    double del = max-min;
                    double h=0, s=0, l;
                    if (image_matr[i, j] > 255)
                        image_matr[i, j] = 255;
                    if (image_matr[i, j] < 0)
                        image_matr[i, j] = 0;
                    l = (max + min) / 2.0;

                    if (del==0)
                    { h = 0; //undefined
                    }
                    else if(max==R && G>=B)
                    { h = 60.0 * (G - B) / (max - min); }
                    else if (max == R && G < B)
                    { h = 60.0 * (G - B) / (max - min) + 360.0; }
                    else if (max == G)
                    { h = 60.0 * (B - R) / (max - min) + 120.0; }
                    else if (max == B)
                    { h = 60.0 * (R - G) / (max - min) + 240.0; }

                    if (l == 0 || max == min)
                    { s = 0; }
                    else if (l>0 && l <= 0.5)
                    { s = (max - min) / (max + min); }
                    else if (l<1 && l>0.5)
                    { s = (max - min) / (2 - (max + min)); }
                    if (h < 0)
                        h =h+360;
                    h = Math.Round(h);
                    s = Math.Round(s);
                    l = Math.Round(l);
                    int H = Convert.ToInt32(h);
                    int S = Convert.ToInt32(s);
                    int L= Convert.ToInt32(l);
                    result[0].SetPixel(i, j, Color.FromArgb(color.A, H, 0, 0));
                    result[1].SetPixel(i, j, Color.FromArgb(color.A, 0, S, 0));
                    result[2].SetPixel(i, j, Color.FromArgb(color.A, 0, 0, L));
                   
                }
            } 
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = result[0];
            pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox2.Image = result[1];
            pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox3.Image = result[2];

        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {

        }

        private void R_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {

        }

        private void filtr3_Click(object sender, EventArgs e)
        {
            double[,] core = new double[3, 3] { { -1, -2, -1 },
                                              { -2,  13, -2 },
                                              { -1, -2, -1 } };
           // Bitmap bmp1 = new Bitmap(Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga"));
            int[] calc_color(Bitmap bmp1, Color a_color, int i, int j, int k, int h)
            {
                int[] a_RGB = new int[3];
                a_color = bmp1.GetPixel(i, j);
                a_RGB[0] = Convert.ToInt32(a_color.R * core[k, h]);
                a_RGB[1] = Convert.ToInt32(a_color.G * core[k, h]);
                a_RGB[2] = Convert.ToInt32(a_color.B * core[k, h]);
                return a_RGB;
            }
            void metod()
            {
                Bitmap bmp1 = (Bitmap)(Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga"));
                int[] a_RGB = new int[3];
                int sum_R = 0, sum_G = 0, sum_B = 0;

                Color col, a_color = Color.Black;
                for (int i = 1; i < bmp1.Width - 1; i++)
                    for (int j = 1; j < bmp1.Height - 1; j++)
                    {
                       // sum_R = 0; sum_G = 0; sum_B = 0;
                        a_RGB = calc_color(bmp1, a_color, i - 1, j - 1, 0, 0);                   
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i - 1, j, 0, 1);                      
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i - 1, j + 1, 0, 2);                   
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i, j - 1, 1, 0);                         
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i, j, 1, 1);                              
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i, j + 1, 1, 2);                       
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i + 1, j - 1, 2, 0);                   
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i + 1, j, 2, 1);                       
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
                        a_RGB = calc_color(bmp1, a_color, i + 1, j + 1, 2, 2);                  
                        sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];

                        if (sum_R < 0) sum_R = 0;
                        if (sum_R >= 256) sum_R = 255;
                        if (sum_G < 0) sum_G = 0;
                        if (sum_G >= 256) sum_G = 255;
                        if (sum_B < 0) sum_B = 0;
                        if (sum_B >= 256) sum_B = 255;
                        col = Color.FromArgb(sum_R, sum_G, sum_B);
                        bmp1.SetPixel(i, j, col);
                        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                        pictureBox1.Image = bmp1;
                        bmp1.Save("D:/Программы/kursovKIT/kursovKIT/imagematr.jpg", bmp1.RawFormat);
                    }
            }
        }

        private void delete_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
            pictureBox2.Image = null;
            pictureBox3.Image = null;
        }
    }
}
        

Так смотрите на каком шаге что-то идет не так, как задумано, с помощью отладчика или отладочного вывода.

Как отлаживать маленькие программы – Блог Петра Калинина

Тут что должно получиться?

Если делить целое на целое, то получится целое (7 / 2 == 3).

Так что видимо тут надо было например делать на 255.0, и сделать переменные double?

Там получается 1, с double вроде бы тоже ошибка была, но попробую еще раз поменять

Есть конечно идея загнать переменные еще под модуль, но это вряд ли спасет от данной ошибки

Дык это понятно, я и говорю, что сейчас там получится 0 если color.R от 0 до 254, и 1 если 255.
Вопрос был что должно получиться )

Ну и

Как-то видимо мозг ночью не соображает. Итак, исправил в общем на что-то такое:

double R = Convert.ToDouble(color.R)/255.0;
                    double G = Convert.ToDouble(color.G) / 255.0;
                    double B = Convert.ToDouble(color.B) / 255.0;
                    double max = Math.Max(R, Math.Max(G, B));
                    double min = Math.Min(R, Math.Min(G, B));
if (del==0)
                    { h = 0; //undefined
                    }
                    else if(max==R && G>=B)
                    { h = Math.Abs( 60.0 * (G - B) / (max - min)); }
                    else if (max == R && G < B)
                    { h = Math.Abs(60.0 * (G - B) / (max - min) + 360.0); }
                    else if (max == G)
                    { h = Math.Abs(60.0 * (B - R) / (max - min) + 120.0); }
                    else if (max == B)
                    { h = Math.Abs(60.0 * (R - G) / (max - min) + 240.0); }

                    if (l == 0 || max == min)
                    { s = 0; }
                    else if (l>0 && l <= 0.5)
                    { s = Math.Abs((max - min) / (max + min)); }
                    else if (l<1 && l>0.5)
                    { s = Math.Abs((max - min) / (2 - (max + min))); }
                    if (h < 0)
                        h =h+360;
                    h = Math.Round(h);
                    s = Math.Round(s);
                    l = Math.Round(l);
                    int H = Convert.ToInt32(h);
                    int S = Convert.ToInt32(s);
                    int L= Convert.ToInt32(l);

На определенной строке выдает: “Значение ‘257’ недопустимо для ‘red’. ‘red’ должно быть больше или равно 0 и меньше или равно 255.”
ARGB=(255, 188, 184, 198)}, H=257, новое значение R=0,73…
Получается, что выполняется вот это условие:

else if (max == B)
    { h = Math.Abs(60.0 * (R - G) / (max - min) + 240.0); }

Неужели что-то еще не поменял, совершенно не могу понять