Есть две проблемы с вашим кодом. Во-первых, вы меняете свое изображение и заменяете свое оригинальное изображение. Поэтому каждый раз, когда вы вносите изменения, они добавляются поверх всех ваших предыдущих изменений. Вам нужно будет где-то сохранить исходное изображение и использовать его в качестве основы для ваших изменений.
Bitmap origbitmap= null;
private void brightnessBar_Scroll(object sender, EventArgs e)
{
//we only capture the "original" bitmap once, at the start of the operation
//and then we hold on to it to apply all future edits against the original
if (origbitmap== null)
origbitmap= (Bitmap)boxPic.Image;
brightnessLabel.Text = brightnessBar.Value.ToString();
boxPic.Image = AdjustBrightness(origbitmap, brightnessBar.Value);
}
Вторая проблема заключается в том, что вы применяете свои изменения к компоненту 'W' ColorMatrix. Документация на ColorMatrix не так уж велика (https://docs.microsoft.com/en-us/dotnet/api/system.drawing.imaging.colormatrix?view=netframework-4.7.2)
Однако компонент W выглядит как перевод, то есть он является прямой добавкой к вашим цветовым каналам. Таким образом, результатом вашей операции является R = R + W, G = G + W, B = B + W, A = A + W. Вероятно, вам нужна скалярная операция;
float[][] FloatColorMatrix ={
new float[] {FinalValue, 0, 0, 0, 0},
new float[] {0, FinalValue, 0, 0, 0},
new float[] {0, 0, FinalValue, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 0, 1}
};
FinalValue
(с вашего трекбара) - множитель исходного цвета. Технически это не будет истинной корректировкой «Яркости» (для этого вы захотите посмотреть преобразования цветового пространства), но это будет очень простой способ линейного изменения интенсивности каждого цветового канала.
Кстати, если ваш трекбар ограничен 255, значение FinalValue никогда не будет превышать 1, а яркость вашего изображения никогда не увеличится. Если ваш трекбар поднимается до 512, FinalValue может увеличиться до 2x (с серединой на 1x), чтобы вы могли максимально увеличить интенсивность 2x на канал.