C# Bildersammlung Vorschläge?

So wie auf der Rechten seite - (Windows, Bilder, Programm)

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ein schönes Projekt, was du dir vorgenommen hast. :)

Ich habe dir mal ein bisschen Code (inkl. Kommentare) und ein Paar Bilder fürs Projekt gemacht.

Welche Elemente du def. benötigst und die wichtigsten Einstellungen

Leider steige ich bei der Datenbankgeschichte aus, deswegen musst du das selber hinbekommen ;)

Ich habe das über ListView und ImageList realisiert. Das ist m.M.n. die Einfachste Art.

In der Imagelist muss die Farbtiefe auf 32 Bit geändert werden und die Bildgröße auf etwas was noch erkennbar ist (Leider sind max. nur 256x256 möglich). Die im Bild dargestellte Größe entspricht dem Seitenverhältnis 16:9

Leider werden somit auch alle Bilder auf diese Größe "gestreckt".

In der ListView muss die ImageList noch für die LargeImageList ausgewählt werden.

Das ist die einfachste Methode. Ansonsten müsstest du während der Laufzeit PictureBoxen Zeichen und die Größen der Boxen aus den Auflösungen der Bilder jeweils berechnen, um das Seitenverhältnis nicht zu zerschießen und eine gleichmäßige (tabellarische) Darstellungen hinzubekommen.

Zudem brauchst du dann auch einen PanelContainer und VScroll.

Die Scroll-Sache macht halt die ListView für dich.

Steht zwar auch im CommentCode erwähne es aber nochmal hier. Du müsstest streng auf Dopplungen achten, sonst werden Bilder 2 Mal ind die ListView gezeichnet.

Der OpenFileDialog lässt sich auch in einen FolderBrowserDialog ändern und mit einer Schleife dann alle jpg gif png usw eines Ordners einlesen. Auch hier gilt wieder: Try & Catch

So hier jetzt der Code und die beiden Bilder:

PS. würde mich über eine Antwort freuen, wie du mit dem Projekt dann vorrankommst :)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // Um Stream nutzen zu können

namespace GF_Bilder_Einlesen
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

openFileDialog1.Title = "Bild auswählen"; // Ist glaube ich klar
openFileDialog1.InitialDirectory = "c:\\users\\matze\\desktop\\"; // Sollte auch klar sein. Wichtig ist doppel \\
openFileDialog1.Filter = "JPG (*.jpg)|*.jpg|PNG (*.png)|*.png|Alle Dateien (*.*)|*.*"; // Hier werden die Dateitypen eingetragen
// Lässt sich vielleicht auch für mehrere Dateitypen in einen Index zusammenfassen
openFileDialog1.FilterIndex = 1; // Standard Dateityp
openFileDialog1.RestoreDirectory = true; // Speichert den ersten Öffnen-Ort für einen zweiten Aufruf
}

private void button1_Click(object sender, EventArgs e)
{

Image myImage ; //Erstellt eine Bildvariable
openFileDialog1.ShowDialog(); //Öffnet das Dateiauswahlfenster
myImage = Image.FromFile(openFileDialog1.FileName); //Übergibt das ausgewählte Bild der Bildvariable

imageList1.Images.Add(myImage); //Fügt das Bild der Bilderliste hinzu

listView1.Items.Clear(); //Löscht den Inhalt der ListView1
//Dadurch entstehen keine Dopplungen, weil die ListView1 zwei Mal dargestellt wird

for (int i=0; i < imageList1.Images.Count; i++)
{ //Läuft die komplette Bilderliste durch und stellt die Bilder nach steigendem Index der Bilderliste im ListView dar
ListViewItem Bild = new ListViewItem();
Bild.ImageIndex = i;
listView1.Items.Add(Bild);
}

// Eine Möglichkeit auf Fehler zu überprüfen, da "Abbrechen" einen "Fatal-" Error erzeugt!!!
// Programmabsturz!!!

//if (openFileDialog1.ShowDialog() == DialogResult.OK)
//{
// try
// {
// if ((myStream = openFileDialog1.OpenFile()) != null)
// {
// using (myStream)
// {
// // Insert code to read the stream here.
// }
// }
// }
// catch (Exception ex)
// {
// MessageBox.Show("Fehler beim Einlesen der Datei. Fehlercode: " + ex.Message);
// }
//}
// Code Von msdn und müsste auf die Bilder-Sache angepasst werden

// In die Datenbank würde ich die die Dateipfade speichern
// also OpenFileDialog1.FileName
// Auf jeden Fall darauf achten, dass keine DOPPLUNGEN gespeichert werden
// Über eine schleife von 0 bis EintragEnde.Datenbank würde ich die Bilder
// in die ImageList1 schreiben/laden
// Achtung! Wenn Dateien gelöscht kommt's vermutlich wieder zum Programm-Crash
// Also Exception Catch einbauen
//
// Mit der gezeigten Schleife jetzt einfach die Bilder in die ListView1 laden
// Das muss evntl. über 2 Buttons realisiert werden. Datei einlesen und Aktualisieren
// Oder eben vorheriges "Löschen" der ListView1

}
}
}
 - (Windows, Bilder, Programm)  - (Windows, Bilder, Programm)

Viruzclothing 
Beitragsersteller
 09.02.2017, 11:45

Danke für deine Super Antwort. Ich werde es gleich mal testen :) 

1

Eine Listview ist so ziehmlich das einfachste, sonst Pictureboxen. Jedenfalls viel Code.

Weil du WindowsForms erwähnst fällt mir da nix andres ein, sonst ist WPF und xaml dein Freund.


Woher ich das weiß:Berufserfahrung – Assistent Production Manager of Microsoft Inc. iR

Thor1889  03.02.2017, 17:39

Die Kombination ListView und ImageList erfordert garnicht mal so viel Code ;)

1