Multiple images in multiple Pictureboxes

11/11/2018 13:31 KingwondA#1
Hi epvp,

ich hab derzeit ein kleines problemchen und zwar:
Ich möchte mehrere Bilder in insgesamt 12 vorgegebenen Pictureboxen laden, nur hab ich kein Plan wie ich dass anstellen soll, vermutlich über eine schleife aber trotzdem bekomm ichs einfach nicht hin...

hier mal der Code:
Code:
 #region Bildbearbeitung

        private void BildOeffnen_Click(object sender, EventArgs e)
        {
            newBitmap?.Dispose();

            var openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "Bitte wählen Sie Ihr(e) Bild(er)";
            openFileDialog.Multiselect = true;
            openFileDialog.Filter = "JPG| *.jpg|JPEG|*.jpeg|GIF|*.gif|PNG|*.png";
            DialogResult dr = openFileDialog.ShowDialog();
            if (dr == DialogResult.OK)
            {
                newBitmap = new Bitmap(openFileDialog.FileName);
                file = Image.FromFile(openFileDialog.FileName);
                pictureBox1.Image = file;
                opened = true;
            }

            // Ordner Suche schließen
            openFileDialog.Dispose();
        }

        private void BildSpeichern_Click(object sender, EventArgs e)
        {
            // Eine Variable fürs Speichern initalisieren ("saveFileDialog")
            var saveFileDialog = new SaveFileDialog();
            // Dropdownmenü, welche Formate gepseichert werden können
            saveFileDialog.Filter = "JPG (*.jpg)|*.jpg|PNG (*.png)|*.png|GIF (*.gif)|*.gif|BMP (*.bmp)|*.bmp";
            saveFileDialog.AddExtension = true;

            DialogResult dr = saveFileDialog.ShowDialog();

            if (dr == DialogResult.OK)
            {
                if (opened)
                {
                    if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.Length - 3).ToLower() == "bmp")
                    {
                        pictureBox1.Image.Save(saveFileDialog.FileName, ImageFormat.Bmp);
                    }
                    if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.Length - 3).ToLower() == "jpg")
                    {
                        pictureBox1.Image.Save(saveFileDialog.FileName, ImageFormat.Jpeg);
                    }
                    if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.Length - 3).ToLower() == "png")
                    {
                        pictureBox1.Image.Save(saveFileDialog.FileName, ImageFormat.Png);
                    }
                    if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.Length - 3).ToLower() == "gif")
                    {
                        pictureBox1.Image.Save(saveFileDialog.FileName, ImageFormat.Gif);
                    }
                }
                else
                {
                    MessageBox.Show("Du musst zuerst ein Bild öffnen!");
                }
            }
        }

        private void trackBarBlur_Scroll(object sender, EventArgs e)
        {
            lblBlur.Text = trackBarBlur.Value.ToString() + " | 100";
            var blur = new GaussianBlur(newBitmap);
            pictureBox1.Image = blur.Process(trackBarBlur.Value);
        }

        private void trackBarKontrast_Scroll(object sender, EventArgs e)
        {
            lblKontrast.Text = trackBarKontrast.Value.ToString() + " | 100";
            Kontrastf = 0.04f * trackBarKontrast.Value;
            pictureBox1.Image = Kontrast.Kontrast_BerechnenHighLevelShit(newBitmap, Kontrastf);
        }
        #endregion
Durch die Zeile
Code:
openFileDialog.Multiselect = true;
Kann ich ja nun schon mehrere Bilder auswählen, diese müssen dann nur noch in die Picturebox geladen werden, eine Bild für eine Picturebox, sind mehr Bilder ausgewählt als es Pictureboxen gibt soll ne Fehlermeldung kommen.
11/11/2018 20:41 .Inuyasha#2
du kannst einfach die Pfade zu allen Dateien und deren Länge mit
Code:
//amountPictureBoxes ist hier die Anzahl deiner PictureBoxes
if (openFileDialog.FileNames.Count() <= amountPictureBoxes) 
    //Bilder hier über ne Methode in die PictureBoxes laden
else
   //Fehler schmeißen
überprüfen.
Danach schreibst du einfach ne Methode in der du alle deine PictureBoxes in ein Array holst, dann loopst du durch das Array deiner PictureBoxes und setzt die Bilder über die FileNames des filedialogs.
11/11/2018 20:42 Ludder231#3
Code:
OpenFileDialog ofd;
DialogResult result = ofd.ShowDialog();
if (result == DialogResult.OK)
{
  string[] filenames = ofd.FileNames;
  foreach (string filename in filenames)
  {
     DoSomethingWithFile(filename);
  }
}
Die Pictureboxen solltest du dynamisch zur Laufzeit erstellen und dann gleich in der Schleife mit einem Bild versehen.
11/11/2018 22:14 KingwondA#4
Danke schonmal :)

Kann ich die Bilder dann trotzdem noch bearbeiten mit meinen Blur oder Kontrast effekt und alle samt wieder Speichern (also alle auf einmal)
11/12/2018 09:28 Ludder231#5
Quote:
Originally Posted by KingwondA View Post
Danke schonmal :)

Kann ich die Bilder dann trotzdem noch bearbeiten mit meinen Blur oder Kontrast effekt und alle samt wieder Speichern (also alle auf einmal)
Ja kannst du. Wenn du die Pictureboxes dynamisch erstellst kannst du ja einfach eine Referenz zu dem Control in einem Array/List speichern, dann kannste ganz leicht auf das Control zugreifen und auch auf das control.Image

PHP Code:
private void setPictureBoxes(Image[] images)
        {
            
int locY 0;
            
int locX 0;

           
            for (
int i 0images.Lengthi++)
            {

                
PictureBox pbFood = new PictureBox();
                
pbFood.Location = new Point(locXlocY);
                
pbFood.Name "pic" i;
                
pbFood.Size = new Size(6464);
                
pbFood.Image images[i];
                
pnlOptions.Controls.Add(pbFood); //Fügt das neue Control dem Panel hinzu
                
locX += 85;             

            }

Diese Funktion rufst du dann einfach auf nachdem du die Bilder in deinem Openfiledialog ausgewählt hast und natürlich wieder wenn du die Images mit deinem Kontrast/Blur bearbeitet hast.