Picturebox, установить и получить свойство, чтобы взять изображение, выбрасывающее нуль C# - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть окно рисунка, которое будет заполнено на OpenFileDialog(), после этого я должен отобразить гистограмму (диаграмму) из него. Я использую свойство get and set для переноса изображения из картинки в другой класс или форму. Но я всегда получаю NullReferenceException. Кажется, что растровое изображение не имеет изображения после того, как я открываю файл изображения, поэтому оно ничего не возвращает. Я пытаюсь заполнить параметр растрового изображения полным путем к изображению, и оно работает, но OpenFileDialog() становится бессмысленным.

  1. Нажмите кнопку параметров
  2. Чтобы отобразить гистограмму

Вот мой код


MainForm.cs

// button for opening image
private void openImage_Click(object sender, EventArgs e)
    {
        OpenFileDialog img = new OpenFileDialog();
        img.Title = "Open Image File...";
        img.Filter = "Image File (*.bmp, *.jpg, *.jpeg, *.png |*.bmp;*.jpg; *.jpeg;*.png";

        if (img.ShowDialog() == DialogResult.OK) {
            pbInput.Image = new Bitmap(img.FileName);
            // blablabla
        }
    }

    // set and get property
    public Image getImage {
        get { return pbInput.Image; }
        set { pbInput.Image = value; }
    }

OptionsForm.cs

    private void hist1_Click(object sender, EventArgs e)
    {
        h1 = new Histogram();
        h1.FormClosed += (s, a) => hist1.Enabled = true;
        hist1.Enabled = false;
        h1.Show();

    }

Histogram.cs

public partial class Histogram : Form
{
    MainForm m = new MainForm();

    public Histogram()
    {
        InitializeComponent();

        Bitmap b = new Bitmap(m.getImage);

        //bla bla bla. . . . . *creating histogram code
    }
 }

Сообщение об ошибке, которое я получаю

Надеюсь, этот вопрос достаточно ясен. Спасибо..! PS: Engli sh не является моим основным языком, поэтому прошу прощения за мою грамматику, et c.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2020

Когда вы пишете MainForm m = new MainForm(); в вашем Histogram.cs,

Вы создаете новый объект формы, который не имеет ссылки на изображение вашей старой формы

То, что вы хотите, это чтобы иметь возможность получить доступ к ссылке на объект старой формы в новой форме или лучше получить ссылку на image3 в Histogram.cs

Один из способов сделать это - передать ее конструктору

Кнопка гистограммы

private void hist1_Click(object sender, EventArgs e)
{
    h1 = new Histogram(this.getImage);
    h1.FormClosed += (s, a) => hist1.Enabled = true;
    hist1.Enabled = false;
    h1.Show();
}

, а затем ваша форма гистограммы

public partial class Histogram : Form
{
    public Histogram(Image image)
    {
        Bitmap b = new Bitmap(image);
    }
}

Это даст вам изображение в форме гистограммы.

0 голосов
/ 20 апреля 2020

Вы должны установить для свойства изображения свойство getImage = new Bitmap (img.FileName);

0 голосов
/ 20 апреля 2020

Почему бы вам напрямую не назначить изображение для вашей собственности?

public Image getImage { get; private set; } // Auto-implemented property.

вот так

if (img.ShowDialog() == DialogResult.OK) {
    getImage = new Bitmap(img.FileName);
    pbInput.Image = getImage;
}

Кстати, getImage не является хорошим названием для свойства , GetSomething обычно используется для методов. Просто позвоните в свою собственность Image:

public Image Image { get; private set; }
...