Неправильно работает контрастность 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;
}
}
}
}