Вам просто нужно сохранить исходное растровое изображение в безопасности и применить 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](https://i.stack.imgur.com/6YZwD.gif)
Процедура
Присвойте изображение элементу управления 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();
}
}