Неправильно работает контрастность c#

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

Bitmap newBitmap = new Bitmap(1000,1000);
    Image file;
    Boolean opened = false;
    float contrast = 0;
private void trackBar2_Scroll(object sender, EventArgs e)
    {
        label4.Text = trackBar2.Value.ToString();

        contrast = 0.04f * trackBar2.Value;

        var newBitmap = new Bitmap(pictureBox1.Image);
        Bitmap bm = new Bitmap(newBitmap.Width, newBitmap.Height);

        Graphics g = Graphics.FromImage(bm);
        ImageAttributes ia = new ImageAttributes();

        ColorMatrix cm = new ColorMatrix(new float[][]{
            new float[]{contrast,0f,0f,0f,0f },
            new float[]{0f,contrast,0f,0f,0f },
            new float[]{0f,0f,contrast,0f,0f },
            new float[]{0f,0f,0f,1f,0f },
            new float[]{0.001f,0.001f,0.001f,0f,1f}});

        ia.SetColorMatrix(cm);

        g.DrawImage(newBitmap, new Rectangle(0, 0, newBitmap.Width, newBitmap.Height), 0, 0, newBitmap.Width, newBitmap.Height,GraphicsUnit.Pixel,ia);
        g.Dispose();
        ia.Dispose();
        pictureBox1.Image = bm;
    }

Ответы (1 шт):

Автор решения: Alexander Petrov

Оригинальное изображение нужно сохранять в неприкосновенности.

https://stackoverflow.com/q/23865511/5045688 - здесь описано, что второй коэффициент в матрице должен зависеть от первого.

Рабочий код:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace WinForm
{
    public partial class Form1 : Form
    {
        TrackBar trackBar;
        PictureBox pictureBox;
        Label label;
        Bitmap originalImage = SystemIcons.Error.ToBitmap();

        public Form1()
        {
            //InitializeComponent();
            trackBar = new TrackBar { Parent = this, Width = 200,
                Minimum = -100, Maximum = 100 };
            trackBar.Scroll += TrackBar_Scroll;

            label = new Label { Parent = this, Left = 220 };

            pictureBox = new PictureBox { Parent = this, Top = 50,
                SizeMode = PictureBoxSizeMode.Zoom, Width = 200, Height = 200 };
            pictureBox.Image = (Image)originalImage.Clone();
        }

        private void TrackBar_Scroll(object sender, EventArgs e)
        {
            label.Text = trackBar.Value.ToString();

            float c = trackBar.Value * 0.01f + 1;
            float t = (1.0f - c) / 2.0f;

            var newBitmap = (Image)originalImage.Clone();

            using (var g = Graphics.FromImage(newBitmap))
            using (var ia = new ImageAttributes())
            {
                var cm = new ColorMatrix(new float[][] {
                    new float[] {c,0,0,0,0},
                    new float[] {0,c,0,0,0},
                    new float[] {0,0,c,0,0},
                    new float[] {0,0,0,1,0},
                    new float[] {t,t,t,0,1}
                });

                ia.SetColorMatrix(cm);

                Image img = originalImage;
                
                g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height),
                    0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia);

                pictureBox.Image?.Dispose();
                pictureBox.Image = newBitmap;
            }
        }
    }
}
→ Ссылка