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

Я использую 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");

        }
    }

person LouisL    schedule 14.12.2010    source источник
comment
Факторизация кода — это хорошо!   -  person Nicolas Repiquet    schedule 14.12.2010


Ответы (2)


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

person Ed S.    schedule 14.12.2010
comment
Да, я делаю это в своей программе. у меня 2 фотобокса. pictureBox1 - это мое исходное изображение, из которого я получаю пиксель и устанавливаю пиксель на изображении pictureBox2. - person LouisL; 14.12.2010
comment
Тогда вам не нужно ничего удалять, и я не уверен, в чем проблема. - person Ed S.; 14.12.2010

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

Я бы поменял:

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

за

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

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

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

person LostBalloon    schedule 29.11.2012