Bild erscheint nicht in eigener PictureBox

Kimbretti

Grünschnabel
Hallo,
ich hab folgendes Problem:
Die Klasse Form1 soll durch ein openFileDialog eine eine PictureBox aus einer anderen Klasse laden
und ein Bild hinein laden. Leider wird aber nur die PictureBox geladen aber es taucht kein Bild
auf?!

Hier die klasse Form1(ohne generierten code)
Code:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Bildbearbeitung;

namespace Bildbearbeitung
{
	/// <summary>
	/// Zusammendfassende Beschreibung für Form1.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.OpenFileDialog openFileDialog1;
		private System.Windows.Forms.MainMenu mainMenu1;
		private System.Windows.Forms.MenuItem menuItem1;
		private System.Windows.Forms.MenuItem menuItem3;
		private System.Windows.Forms.MenuItem menu_ende;
		private System.Windows.Forms.MenuItem menu_Open;
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		
		
		private BildBox			bildBox;
		
		public Form1()
		{
			
			InitializeComponent();

			
		}

		

		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		private void menu_ende_Click(object sender, System.EventArgs e)
		{
			Close();
		}
                  
		void menu_Open_Click(object sender, System.EventArgs e)
		{
			string filter = "Bilders (*.jpg; *.bmp) | *.jpg; *.bmp";
			
			this.openFileDialog1.Filter = filter;

			if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
			{
				// hol den Dateinamen
				string dateiname = this.openFileDialog1.FileName;
				
				Bitmap bild = new Bitmap(dateiname);
				

					//erzeugt eine neue Bildbox mit bild
					this.bildBox = new BildBox(dateiname);
					this.bildBox.MdiParent = this;
					this.bildBox.Show();
					Invalidate();
				
			}

		}
	}
}
und hier die Klasse BildBox:
Code:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Bildbearbeitung;

namespace Bildbearbeitung
{
	/// <summary>
	/// Zusammendfassende Beschreibung für BildBox.
	/// </summary>
	public class BildBox : System.Windows.Forms.Form
	{
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private Bitmap			bild, kopie;
		private static string	dateiname;
		private int				breit, hoch;
		
		
		

		public BildBox()
		{
			InitializeComponent();
		}

		public BildBox(string datei)
		{
			dateiname = datei;
			this.bild = new Bitmap(dateiname);
			this.kopie = (Bitmap) this.bild.Clone();
			hoch = this.bild.Height;
			breit = this.bild.Width;
			InitializeComponent();
		}



		#region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung. 
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		private void InitializeComponent()
		{
			// 
			// BildBox
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(728, 578);
			this.Name = "BildBox";
			this.Text = "BildBox";

		}
		#endregion
		/// <summary>
		/// Diese Methode gibt den Dateinamen des aktuellen Bildes aus.
		/// </summary>
		/// <returns>
		/// Einen string, den Dateinamen
		/// </returns>
		public string gibDateinamen()
		{
			return dateiname;
		}
		/// <summary>
		/// Diese Methode gibt die Breite des aktuellen Bildes aus.
		/// </summary>
		/// <returns>
		/// Einen int, die Breite des akt. Bildes
		/// </returns>
		public int gibBreite()
		{
			return breit;
		}
		/// <summary>
		/// Diese Methode gibt die Höhe des aktuellen Bildes aus.
		/// </summary>
		/// <returns>
		/// Einen int, die Höhe des akt. bildes
		/// </returns>
		public int gibHoehe()
		{
			return hoch;
		}
		/// <summary>
		/// Diese Methode gibt das zur Zeit geöffnete Bild zurück.
		/// </summary>
		/// <returns>
		/// Ein Bitmap, das aktuelle Bild
		/// </returns>
		public Bitmap gibBild()
		{
			return this.bild;
		}
		/// <summary>
		/// Diese Methode gibt die Kopie des aktuellen Bildes aus.
		/// </summary>
		/// <returns>
		/// Ein Bitmap, eine Kopie des akt. Bildes</returns>
		public Bitmap gibKopie()
		{
			return this.kopie;
		}
		/// <summary>
		/// Diese Methode kopiert die Kopie in die Variable Bild
		/// </summary>
		public void kopierBilder()
		{
			this.bild = (Bitmap) this.kopie.Clone(); //klären wozu Clone da ist!
		}
		/// <summary>
		/// Diese Methode kopiert das Bitmap Bild in die Kopie um die änderungen auszuführen!
		/// </summary>
		public void setzEffekt()
		{
			this.kopie = (Bitmap) this.bild.Clone();
		}
	}
}

Wäre nett wenn mir jemand helfen könnte!

Danke Azmodan für die beiden Tipps, den einen habe ich wie du siehst gerade umgesezt und an den anderen mit dem try/catch mache ich mich etwas später ran.

Ich hoffe das mit dem Code geht jetzt soweit in Ordnung.

Kimbretti
 
Zuletzt bearbeitet:
Hallo und willkommen im Forum!

Bitte sei doch so nett und überarbeite deinen Beitrag nochmal:
  • Packe deinen Code bitte in einen Code-Block (mit den Code-Tags), dann breche ich mir beim Versuch, deinen Code zu lesen, nicht die Augen. ;)
  • Rücke deinen Code so ein, wie du das auch beim Programmieren tun würdest.
  • Formulier deine Frage bitte genauer; ich verstehe gerade noch nicht ganz, was du wissen möchtest.
Ein Tipp von mir mal ins Blaue hinein:
Pack das alles in ein try/catch-Konstrukt, setz einen Break-Point auf den catch und sieh dir dann im Debugger an, welche Message er ausgibt. Wenn du diese hier postest, sind wir der Lösung deines Problems schon etwas näher. :D

Gruß, Niko

<edit>
Ja, doch, jetzt kann man den Code besser lesen. Dankeschön!
Gib' Bescheid, wenn du das mit try/catch ausprobiert hast, oder Probleme damit hast.
</edit>
 
Zuletzt bearbeitet:
Hi.

Zuerst einmal ein bisschen was zu deinem Code.

1) Diese ganzen Methoden in der BildBox-Klasse, welche einen Wert zurückliefern könntest du durch sogenannte "Properties" (Eigenschaften) schöner lösen. Vorallem dieses gibHoehe und gibBreite.

Anstatt von gibHoehe und der Variablen-Zuweisung in deinem Konstruktor.
Code:
public int ImageHeight
{
    get { return bild.Height; }
}
Und das selbe könntest noch für die Breite machen.

Und noch eine Frage.
Wo zeigst du das Bild an, wo zeichnest du es, oder setzt es zum Beispiel als Hintergrundbild!?
Ich kann keine Zeile erkennen die das macht.

MfG,
Alex
 
Hi Alex,

erstmal schönen Dank für den Tipp mit den Properties, bei Java hatte ich das immer mit den getis/settis Methoden gemacht. So siehts allerdings viel eleganter aus!

Ich dachte, wenn ich in der Methode

Code:
void menu_Open_Click(object sender, System.EventArgs e)

eine neue BildBox erzeuge und ihr die geöffnete Datei übergebe würde das Bild automatisch in der BildBox angezeigt.
Die Form wird auch geöffnet, allerdings bleibt sie leer.

Ich hatte es auch schon mit PictureBox aus der Toolleiste versucht, damit klappte es.

Ich brauche allerding ne eigene Klasse, damit das alles schön Objekt Orienentiert bleibt.
Ausserdem will ich dann ein paar Effekte zur Fotobearbeitung nachstellen. Wie z.B. Kontrast ändern oder einen Weichzeichner einbauen. Von daher muss ich (glaube ich!) da ne eigene Klasse BildBox haben.

Ich hoffe, ich hab nicht zu verwirrend geschrieben!

Danke für die Mühe!

Bis denn dann
KK
 
Nun, du hast deine Klasse zwar BilderBox genannt, aber nur von Form abgeleitet. (Ist ja auch ok.)
Nur woher soll die Klasse wissen was sie mit dem Bild anstellen soll?

Code:
namespace Bildbearbeitung
{
	public class BildBox : System.Windows.Forms.Form
	{
		private Bitmap			bild, kopie;
		private static string	dateiname;
		private int				breit, hoch;
		private PictureBox		picBox;
		
		public BildBox(string datei)
		{
			dateiname = datei;
			this.bild = new Bitmap(dateiname);
			this.kopie = (Bitmap) this.bild.Clone();
			hoch = this.bild.Height;
			breit = this.bild.Width;
			InitializeComponent();
		}



		#region Windows Form Designer generated code
		private void InitializeComponent()
		{
			// 
			// BildBox
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(728, 578);
			this.Name = "BildBox";
			this.Text = "BildBox";
			
			this.picBox = new PictureBox();
			this.picBox.Image = this.bild;
			this.picBox.Dock = DockStyle.Fill;
			this.Controls.Add(picBox);

		}
...

Du könntest es ja mal so probieren. (Also eine PictureBox auf das Formular legen..)

Und wegen dem Bearbeiten. Da brauchst du keine eigene Klasse zum Darstellen, nur eine Klasse mit Methoden welche das Bild zum Beispiel als Parameter fordern (mit eventuellen Zusatzparametern für den Effekt) und dann als Return-Wert das veränderte Bild zurückgeben. Oder eine Klasse die intern das Bild speichert, Methoden anbietet zum Verändern, und du das Bild dann über eine Eigenschaft abfragen kannst.
Zum Beispiel so:
Code:
// usings ..

public class ImageEditor
{
	private Image original_image;
	private Image current_image;
	
	public ImageEditor(Image img)
	{
		this.image = this.current_image = img;
	}
	
	public Image OriginalImage
	{
		get { return original_image; }
	}
	
	public Image ModifiedImage
	{
		get { return current_image; }
	}
	
	public void ModifyContrast(int value)
	{
		// irgendwas mitm bild machen .. 
		// und dann wieder in der image variable speichern
	}
}
 
Zurück