0
votes

Picturebox, définir et obtenir une propriété pour prendre une image en jetant null C #

J'ai une OpenFileDialog() à OpenFileDialog() qui sera remplie par OpenFileDialog() après cela, je dois en rendre l'histogramme (graphique). J'utilise la propriété get and set pour prendre l'image de Picturebox vers une autre classe ou un autre formulaire. Mais j'obtiens toujours NullReferenceException. Le bitmap semble ne pas avoir l'image après avoir ouvert un fichier image, donc il ne renvoie rien. J'essaie de remplir le paramètre bitmap avec le chemin complet d'une image et cela fonctionne, mais OpenFileDialog() devient inutile.

  1. Cliquez sur le bouton d'options:

    Cliquez sur le bouton d'options

  2. pour rendre un histogramme:

    Pour rendre un histogramme

Voici mon code


MainForm.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
    }
 }

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();

    }

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

Le message d'erreur que j'ai reçu:

Message d'erreur que je reçois

J'espère que cette question est suffisamment claire. Merci..! PS: l'anglais n'est pas ma langue principale, alors excusez-moi pour ma grammaire, etc.


0 commentaires

3 Réponses :


0
votes

Pourquoi n'attribuez-vous pas directement l'image à votre propriété?

public Image Image { get; private set; }

comme ça

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

Btw., getImage n'est pas un bon nom pour une propriété. GetSomething est généralement utilisé pour les méthodes. Appelez simplement votre propriété Image :

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


1 commentaires

Je pense que @MihirDave a trouvé la cause du problème. Vous créez un nouveau formulaire dans Histogram.cs avec MainForm m = new MainForm(); . Cette nouvelle instance du formulaire MainForm ne contient pas les entrées que vous avez effectuées dans le formulaire d'origine. Ajoutez le Bitmap comme paramètre de constructeur aux options et aux formulaires d'historgramme. Passez ensuite cette image lors de l'ouverture des formulaires: new OptionsForm(getImage); et la même chose avec la forme d'histogramme.



0
votes

Vous devez définir l'image sur la propriété d'image getImage = new Bitmap (img.FileName);


0 commentaires

2
votes

Lorsque vous écrivez MainForm m = new MainForm(); dans votre Histogram.cs ,

Vous créez un tout nouvel objet Form qui ne fait pas référence à l'image de votre ancien formulaire

Ce que vous voulez, c'est pouvoir accéder à la référence d'objet de l'ancien formulaire dans votre nouveau formulaire ou mieux obtenir cette référence image3 dans Histogram.cs

Une façon de le faire est de le transmettre au constructeur

Bouton Histogramme

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

puis votre formulaire Histogramme

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

Cela vous donnera l'image sous forme d'histogramme.


2 commentaires

Oh, j'ai oublié de mentionner. Le hist1_Click , est sur le OptionForm.cs . Alors je ne peux pas mettre en œuvre, que dites-vous (?)


Ensuite, vous devez passer Image de MainForm à OptionForm (de la même manière que je l'ai fait dans l'exemple), conserver sa référence, puis la transmettre à Histogram.