0

Написал алгоритм для изменения контрастности изображения, но выдает данную ошибку

введите сюда описание изображения

Как можно исправить ошибку?

Код для программы

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace WindowsFormsApp2 { public partial class Form1 : Form { Bitmap newBitmap; Image file; Boolean opened = false; float contrast = 0;

public Form1()
{
    InitializeComponent();
}

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
{
    DialogResult dr = openFileDialog1.ShowDialog();

    if (dr == DialogResult.OK) // Если в диалоге была нажата кнопка ОК
    {
        file = Image.FromFile(openFileDialog1.FileName);
        pictureBox1.Image = new Bitmap(openFileDialog1.FileName); // Загружаем изображение
        pictureBox1.Image = file;
        opened = true;
    }
}

private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image != null) // Если изображение в picturebox1 есть
    {
        SaveFileDialog sfd = new SaveFileDialog(); // Диалог для выбора файлов
        sfd.Filter = "Image Files (*.JPG;*.PNG) | *.JPG;*.PNG"; // Фильтр файлов
        if (sfd.ShowDialog() == DialogResult.OK) // Если нажата кнопка ОК
        {
            pictureBox1.Image.Save(sfd.FileName); // Сохраняем изображение
        }
    }
}

private void оттенкиСерогоToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image != null)
    {
        Bitmap input = new Bitmap(pictureBox1.Image); // Создаем Bitmap из изображения, который находится в pictureBox1
        Bitmap output = new Bitmap(input.Width, input.Height); // Создаём Bitmap для черно-белого изображения
        for (int j = 0; j < input.Height; j++)
                for (int i = 0; i < input.Width; i++)
            {
                // Получаем (i,j) пиксель
                UInt32 pixel = (UInt32)(input.GetPixel(i, j).ToArgb());
                // Получаем компоненты цветов пикселя
                float R = (float)((pixel & 0x00FF0000) >> 16);
                float G = (float)((pixel & 0x0000FF00) >> 8);
                float B = (float)((pixel & 0x000000FF));
                // Делаем цвет черно-белым (оттенок серого) - находим их среднее арифметическое
                R = G = B = (R + G + B) / 3.0f;
                // Собираем новый пиксель по частям
                UInt32 newPixel = 0xFF000000 | ((UInt32)R << 16) | ((UInt32)G << 8) | ((UInt32)B);
                // Добавляем его в Bitmap нового изображения
                output.SetPixel(i, j, Color.FromArgb((int)newPixel));                      
            }
            // Выводим черно-белое изображение из Bitmap в PictureBox1
        pictureBox1.Image = output;
    }
}

private void trackBar1_Scroll(object sender, EventArgs e)
{
    label3.Text = trackBar1.Value.ToString();
    int r, g, b;
    var image = new PictureBox();
    var loadImage = new Bitmap(pictureBox1.Image);
    var WidthHeightImage = new Bitmap(loadImage.Width, loadImage.Height);

    for (int j = 0; j < loadImage.Height; j++)
        for (int i = 0; i < loadImage.Width; i++)
        {
            Color pixel = loadImage.GetPixel(i, j);
            r = pixel.R + trackBar1.Value;
            if (r > 255) r = 255; if (r < 0) r = 0;
            g = pixel.G + trackBar1.Value;
            if (g > 255) g = 255; if (g < 0) g = 0;
            b = pixel.B + trackBar1.Value;
            if (b > 255) b = 255; if (b < 0) b = 0;
            Color res = Color.FromArgb(r, g, b);
            WidthHeightImage.SetPixel(i, j, res);
        }
    pictureBox1.Image = WidthHeightImage;
    image.Image = WidthHeightImage;

}

private void trackBar2_Scroll(object sender, EventArgs e)
{
    label4.Text = trackBar2.Value.ToString();

    contrast = 0.04f * trackBar2.Value;

    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;
}

} }

  • Bitmap newBitmap; ты нигде не придаешь значения данной переменой, вот она у тебя и null. Мб ты хотел забыл инициализировать её Bitmap newBitmap = new Bitmap(500,500)? – Megaluk May 25 '21 at 17:10
  • А разве я не загружаю в newBitmap ширину и высоту изображения? Bitmap bm = new Bitmap(newBitmap.Width, newBitmap.Height); – Cat Ba-dum-tss May 25 '21 at 17:13
  • здесь ты пытаешься создать новый обьект Bitmap bm указывая ширину и высоту пустого newBitmap который не был инициализирован . – Megaluk May 25 '21 at 17:15
  • Да, действительно, больше исключения не выдает. Но при изменении контрастности просто изображение исчезает, странно... – Cat Ba-dum-tss May 25 '21 at 17:16

0 Answers0