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.
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:
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.
3 Réponses :
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.
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.
Vous devez définir l'image sur la propriété d'image getImage = new Bitmap (img.FileName);
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.
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.