Как использовать ползунок для регулировки яркости растрового изображения? - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь отрегулировать значения RGB, чтобы сделать изображение темнее или светлее в моем проекте обработки изображений.Было бы неплохо включить как затемнение, так и освещение в одном элементе управления TrackBar, при этом нейтральное неизменное изображение отображается, когда ползунок установлен на 0 в середине.
Однако в настоящее время я все еще пытаюсь понять, как это сделать.только одна функция, например затемнение, на одном TrackBar.

После помещения элемента управления TrackBar (Min 0, Max 10) в мой проект я использую событие trackbar_scroll, чтобы определить, когда TrackBar прокручивается.
Я также закодировал его, чтобы затемнить изображение, вычитая определенное значение байта из RGB каждого пикселя изображения.
Полоса прокрутки успешно затемняет изображение, когда вы перемещаете его вправо, однако я также хочу затемнять его, когдаВы перемещаете трекбар влево назад в исходное положение.

private void trbBrightness_Scroll(object sender, EventArgs e)
{
    if (bitmapImage == null) return; 

    Byte Red, Green, Blue;
    int iWidth = 320;
    int iHeight = 240;

    for (int i = 0; i < iWidth; i++)
    {
        for (int j = 0; j < iHeight; j++)
        {
            Color pixel = ImageArray[i, j];

            Red = pixel.R;
            Green = pixel.G;
            Blue = pixel.B;

            Color newColor = 
                Color.FromArgb(255, 
                               Red - Convert.ToByte(Red * (trbBrightness.Value * 0.1)), 
                               Green - Convert.ToByte(Green * (trbBrightness.Value * 0.1)), 
                               Blue - Convert.ToByte(Blue * (trbBrightness.Value * 0.1)));
            ImageArray[i, j] = newColor;

Прямо сейчас оно просто затемняет изображение, как я хочу, однако я ожидаю, что когда вы сдвинете влево, ползунок в основном отменит затемнениекогда вы сдвинете его вправо.

Есть ли способ определить, когда значение ползунка увеличивается, сделайте это, и когдазначение ползунка уменьшается, не так ли?
Я предполагаю, что мне нужно каким-то образом сохранить старое значение трекбара, чтобы я мог сравнить его с новым?


где я могу получить:

if (trackbar value is increasing) 
{

} 
else if (trackbar value is decreasing)
{

}

1 Ответ

1 голос
/ 13 апреля 2019

Вам просто нужно сохранить исходное растровое изображение в безопасности и применить ColorMatrix к исходному растровому изображению ImageAttributes при настройке значений.
Конечно, вы не корректируете то, что уже было отрегулировано, иначе вы никогда не вернетесь к исходным значениям яркости / контрастности вашего исходного растрового изображения.
Установите новые значения в исходное растровое изображение, затем отобразите только результаты, сохранив оригинал.

Компонент Контраст может быть установлен в диапазоне от -1.00f до 2.00f.
Когда значения контрастности опускаются ниже 0, вы инвертируете цвета, получая негативное изображение. Вам нужно решить, разрешаете ли вы такое поведение. В противном случае вы можете ограничить контраст до минимума 0.00f: применительно ко всем цветным компонентам генерируется серый шарик (вообще никакого контраста).

Значения компонента Яркость могут быть установлены в диапазоне от -1.00f до +1.00f. Выше ниже у вас есть полностью белые и полностью черные результаты.

Использование идентификационной матрицы в качестве справки:

C = Contrast = 1: B = Brightness = 0

    C, 0, 0, 0, 0        1, 0, 0, 0, 0
    0, C, 0, 0, 0        0, 1, 0, 0, 0
    0, 0, C, 0, 0        0, 0, 1, 0, 0
    0, 0, 0, 1, 0        0, 0, 0, 1, 0
    B, B, B, 1, 1        0, 0, 0, 1, 1

(Если вы привыкли к определению матрицы math или к тому, как ее определяют другие платформы, вы можете подумать, что это неправильно. Это просто способ определения ColorMatrix в .Net / GDI говор ).

Пример кода, необходимого для настройки яркости и контрастности растрового изображения, с использованием ColorMatrix и стандартного элемента управления PictureBox для представления результатов.

Пример результата :

Bitmap Brightness Contrast Adjustment

Процедура
Присвойте изображение элементу управления PictureBox, затем присвойте то же изображение объекту растрового изображения, здесь поле с именем adjustBitmap:

Bitmap adjustBitmap = null; 

Где-то (Form.Load(), может быть), назначьте изображение для PicureBox и то же изображение для adjustBitmap, что сохранит исходные значения цвета изображения.
Примечание : Dispose() объекта adjustBitmap при закрытии формы (Form.FormClosed).

Добавьте 2 элемента управления TrackBar, один для регулировки яркости и один для контрастности (здесь названы trkContrast и trkBrightness).

Трекбар Brigthness будет иметь: Minimum = -100, Maximum = 100, Value = 0
Трекбар Contrast будет иметь: Minimum = -100, Maximum = 200, Value = 100

Подписаться и назначить оба одинаковых обработчика события Scroll.
Код обработчика вызывает метод, отвечающий за настройку яркости и контрастности растрового изображения, используя текущие значения 2 элементов управления TrackBar и ссылку на исходное растровое изображение:

private void trackBar_Scroll(object sender, EventArgs e)
{
    pictureBox1.Image = AdjustBrightnessContrast(adjustBitmap, trkContrast.Value, trkBrightness.Value);
}

Основной метод преобразует значения int TrackBars в значения с плавающей точкой в ​​ранее описанных диапазонах и затем в массив Matrix:
Новый ColorMatrix назначен классу ImageAttribute, который используется в качестве параметра в перегрузке метода Graphics.DrawImage , которая принимает ImageAttribute.

public Bitmap AdjustBrightnessContrast(Image image, int contrastValue, int brightnessValue)
{
    float brightness = -(brightnessValue / 100.0f);
    float contrast = contrastValue / 100.0f;
    using (Bitmap bitmap = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb))
    using (Graphics g = Graphics.FromImage(bitmap))
    using (ImageAttributes attributes = new ImageAttributes())
    {
        float[][] matrix = {
            new float[] { contrast, 0, 0, 0, 0},
            new float[] {0, contrast, 0, 0, 0},
            new float[] {0, 0, contrast, 0, 0},
            new float[] {0, 0, 0, 1, 0},
            new float[] {brightness, brightness, brightness, 1, 1}
        };

        ColorMatrix colorMatrix = new ColorMatrix(matrix);
        attributes.SetColorMatrix(colorMatrix);
        g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, attributes);
        return (Bitmap)bitmap.Clone();
    }
}
...