Удалить фильтр на изображении

Я использую AForge.net для фильтрации каналов, у меня есть 3 кнопки, красная, синяя и зеленая. Когда я нажимаю на красную кнопку, он применяет фильтр красного канала. Однако, когда я продолжаю нажимать на синюю кнопку, она будет перекрывать красную, и изображение темнеет.

Кто-нибудь знает, как я могу "избавиться" от красного канала, когда синий - щелчок, и наоборот, чтобы фильтр не перекрывал друг друга? Ниже приведен фрагмент моего кода.

 private void redchannel_Click_1(object sender, EventArgs e)
    {
        try
        {

            pictureBox1.Image = pic;
            pictureBox2.Image = pic2;

            // create filter
            ChannelFiltering filter = new ChannelFiltering();
            // set channels' ranges to keep
            filter.Red = new IntRange(0, 255);
            filter.Green = new IntRange(255, 255);
            filter.Blue = new IntRange(255, 255);
            // apply the filter
            filter.ApplyInPlace(pic2);


        }


        catch (Exception)
        {
            throw new ApplicationException("Failed loading image");
        }
    }

    private void bluechannel_Click_1(object sender, EventArgs e)
    {
        try
        {
            pictureBox1.Image = pic;
            pictureBox2.Image = pic2;

            // create filter
            ChannelFiltering filter = new ChannelFiltering();
            // set channels' ranges to keep
            filter.Red = new IntRange(255, 255);
            filter.Green = new IntRange(255, 255);
            filter.Blue = new IntRange(0, 255);
            // apply the filter
            filter.ApplyInPlace(pic2);

        }




        catch (Exception)
        {
            throw new ApplicationException("Failed loading image");
        }
    }

    private void greenchannel_Click_1(object sender, EventArgs e)
    {
        try
        {
            pictureBox1.Image = pic;
            pictureBox2.Image = pic2;

            // create filter
            ChannelFiltering filter = new ChannelFiltering();
            // set channels' ranges to keep

            filter.Red = new IntRange(255, 255);
            filter.Green = new IntRange(0, 255);
            filter.Blue = new IntRange(255, 255);
            // apply the filter
            filter.ApplyInPlace(pic2);
        }
        catch (Exception)
        {
            throw new ApplicationException("Failed loading image");

        }
    }

2 ответа

Вам необходимо сохранить исходное изображение, а также потенциально измененное изображение дисплея. Выполните ваши расчеты на оригинале и покажите их с отображением изображения. Никогда не изменяйте оригинал, только изображение на дисплее.

Мое лучшее предположение - то, что вы сейчас делаете, это то, что вы инициализируете pic2 как копию исходного изображения. Затем вы продолжаете добавлять фильтры в pic2. Так что получается, что у вас есть чистое изображение, затем примените 1-й фильтр, 2-й фильтр и так далее.

Я бы поменял:

pictureBox1.Image = pic;
pictureBox2.Image = pic2;

за

pictureBox1.Image = pic;
pictureBox2.Image = pic.clone();

Другое дело, что вы можете указать все 3 кнопки на одну и ту же функцию. 90% из имеющихся у вас трех функций - это повторение кода. Кошмар для обслуживания.

Еще лучшим решением было бы: Другой способ сделать это - сохранить каждую кнопку отдельно (3 функции нажатия кнопки), где вы вызываете новую функцию фильтрации с параметрами Red, Green & Blue.

Другие вопросы по тегам