Laden...

Dateityp ermitteln - speziell für Bilder

Erstellt von Stephen48 vor 11 Jahren Letzter Beitrag vor 11 Jahren 8.519 Views
S
Stephen48 Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren
Dateityp ermitteln - speziell für Bilder

Gibt es eine Methode den Typ einer Datei, insbesondere Bilddateien festzustellen, so dass man diese dann z.B. anzeigen kann?

Aktuell habe ich das im Code behelfsmäßig gelöst:


            
            dateityp = Path.GetExtension(dateiname);
            if (dateityp == ".PNG")
            {
                //MessageBox.Show("Die ausgewählte Datei ist ein Bild");

                pictureBoxDateiAnzeige.Visible = true;
                pictureBoxDateiAnzeige.Load(dateiname);

                return;
            }

Da es aber mehr als 1 Bildtyp gibt, ist die obige Methode wenig sinnvoll.
Wie geht es besser?


Besten Dank und viele Grüße,
Stephen

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

Du könntest Dir ein Array oder eine Liste der zu erwartenden Endungen machen und dann überprüfen, ob die gefundene Endung darin enthalten ist.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

C
2.122 Beiträge seit 2010
vor 11 Jahren

Die Picturebox aus deinem Beispiel findet selbst raus um was für einen Bildtyp (jpg, png...) es sich handelt. Das sind Infos die im Header einer Bilddatei stehen, falls du diese genauen Infos brauchst kannst du die aus den ersten paar Bytes auslesen. Google "image format header" oder ähnliches hilft dir da weiter.
Damit wärst du unabhängig von der Endung. Es gibt ja Spezialisten die glauben, wenn sie ein jpg in bmp umbenennen, haben sie das Bild wieder in was verlustfreies konvertiert 😉

Was macht dein Beispiel wenn ein Bild auf "png" endet statt "PNG"?

2.080 Beiträge seit 2012
vor 11 Jahren

Ich habe mal ein Dictionary erstellt, das als Schlüssel die Funktion des Typs (also z.B. Bilder oder Musik) dar stellt und als Wert habe ich eine einfache Liste vom Typ string, in dem alle mir bekannten Datei-Typen enthalten sind.

Mit allen Datei-Typen, die ich bisher eingetragen habe, sieht das dann so aus:

            Dictionary<string, List<string>> t = new Dictionary<string, List<string>>();
            t.Add("Grafik/Fotoformate", new List<string>() { "bmp", "dib", "jpg", "peg", "jpe", "jfif", "gif", "tif", "tiff", "png", "ico" });
            t.Add("Text", new List<string>() { "doc", "docx", "dot", "dotx", "rtf" });
            t.Add("Gepackte Dateien", new List<string>() { "rar", "zip", "ace", "uha", "7z" });
            t.Add("Excel", new List<string>() { "xls", "xlsx", "xlt", "xltx" });
            t.Add("Adobe-Reader", new List<string>() { "pdf" });
            t.Add("PowerPoint", new List<string>() { "ppt", "pptx", "pot", "potx", "pps", "ppsx" });
            t.Add("Outlook", new List<string>() { "pst" });
            t.Add("Access", new List<string>() { "mdb", "accdb" });
            t.Add("OneNote", new List<string>() { "one" });
            t.Add("Publisher", new List<string>() { "pub" });
            t.Add("Webdateien", new List<string>() { "htm", "html", "php" });
            t.Add("Audio", new List<string>() { "wav", "mp3" });
            t.Add("Video", new List<string>() { "avi", "mpg", "mpeg", "mov", "flv" });
            t.Add("Sonstige", new List<string>() { "cab", "iso" });
            t.Add("Anwendung", new List<string>() { "exe" });

Ist natürlich noch erweiterbar, aber das sollte so die allgemein bekannten Typen abdecken.
Auch müsstest du bei der Arbeit mit den Datei-Erweiterungen darauf achten, dass die nie mit dem Punkt davor sind und auch immer klein geschrieben sind.
Aber das dürfte ja kein Problem sein.

Damit kann zwar nicht heraus finden, was für ein Typ die Datei ist, zumindest nicht, wenn der Typ nicht als Erweiterung da steht, aber es ist zumindest eine ganz praktische Liste.
Ich hab mir z.B. mal eine Methode gebaut, die aus Allen einen Filter für einen OpenFileDialog baut und zurück gibt.

Hoffe es hilft ^^

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

C
2.122 Beiträge seit 2010
vor 11 Jahren

Sinnvoller wäre doch, die Dateiendungen als Schlüssel zu halten und den Dateityp als Wert zu hinterlegen. So macht das Dictionary doch keinen Sinn.

5.942 Beiträge seit 2005
vor 11 Jahren

Hallo zusammen

Ja, würde ich auch sagen @chilic.

@Palladin007
Mach dann eine Abfrage mit:

var value = dictionary[extension.ToLower()];

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

2.080 Beiträge seit 2012
vor 11 Jahren

Naja, das Dictionary habe ich mir in erster Linie für die Filter geschrieben und da ist das dann durchaus praktisch, weil ich ja keine Endung suche, sondern einfach nur alle Endungen hinter der Bedeutung haben will.

Ich hab mir auch eine Klasse geschrieben, die auch das beinhaltet, was du sagst, also die Möglichkeit bietet, die Bedeutung an Hand der Endung zu suchen, aber die Klasse hab ich nicht mehr gefunden.

Kann mich ja mal jetzt am Wochenende ran setzen und neu schreiben, vielleicht kriege ich es ja genauso hin, wie ich es erst hatte^^
Und die Methode für den Filter baue ich dann angepasst gleich mit ein.

@Peter:
Ja, wenn ich die Klasse neu schreibe, baue ich das natürlich mit ein, sonst hat es ja gar keinen Sinn^^

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

S
Stephen48 Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren
@ALL - Danke!

Danke est mal an alle!

Viele gute Ansätze und Ideen! Die Idee eine Klasse zur Typermittlung zu schreiben, find ich sehr gut.

@Palladin007: Wenn du die Klasse neu schreibst, wäre ich sehr an ihr interessiert.

@Chilic: Mit "png" anstatt "PNG" funktioniert es natürlich nicht.


Besten Dank und viele Grüße,
Stephen

2.080 Beiträge seit 2012
vor 11 Jahren

Ja, bin grad dabei und überlege, wie ich das am besten mache.

Ich hab mal irgendwo was von einer Klasse gehört, die ähnlich dem Dictionary zwei Elemente speichern kann, allerdings diese untereinander in Verbindung setzt.

Da ich das nicht mehr gefunden habe, baue ich das erst mal so ähnlich. Zwei Listen und ein zweidimensionales Array. In den Listen sind die Daten und in dem Array bringe ich jeweils Beschreibung und Extension über den Index der jeweiligen Liste in eine Beziehung.

Ich will so ein möglichst schnelles Abrufen der Daten ermöglichen, auch wenn es sehr viele sind. Die Beziehung soll dabei ein möglichst schnelles Finden der Daten ermöglichen, egal ob man nach der Beschreibung oder der Endung sucht.

Mir kommt das etwas unpraktisch vor, kennt da jemand eine bessere Möglichkeit?
Wenn es das doch nicht gibt und ich mich geirrt habe, werd ich das mal durchdenken und allgemein tauglich machen.

Edit:
Ich werde auf jeden Fall alle Daten so suchen, dass ich nur die "Klein-Schrift" vergleiche. Das kannst du bei dir ja auch erst einmal einbauen, ist ja nicht schwer.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Palladin007,

es ehrt dich, dass du so eine Klasse schreiben willst. Trotzdem ist die Frage dazu - in Bezug auf den Titel - ein bisschen offtopic.

Ich vermute mal, du meinst mit "untereinander in Verbindung" eher "wechselseitig in Verbindung", also dass man nicht nur wie beim Dictionary schnell zu einem Key das Value finden kann, sondern auch zu einem Value schnell den Key. Dafür gibt es möglicherweise fertige Klassen, aber soweit ich weiß keine im Framework. Anderseits ist so eine Klasse schnell geschrieben, die intern einfach zwei Dictionaries verwendet, für jede Richtung eins.

Der konkrete Fall hat noch eine kleine Besonderheit, denn natürlich willst du für die Rückrichtung nicht die Liste als Key, sondern jedes der Elemente aus den Listen wird zu einem eigenen Key. Aber das ist ja kein Problem, solange keine Extension in mehr als einer Liste auftaucht.

Ob es für diesen Sonderfall auch fertige Klassen gibt, würde ich bezweifeln. Und wenn, sind die vermutlich nicht so leicht zu finden. Aber wie gesagt ist sowas ja schnell geschrieben.

herbivore

2.080 Beiträge seit 2012
vor 11 Jahren

Das mit zwei Dictionarys zu machen, da hätte ich auch drauf kommen können 😄
Danke für den Hinweis und wenn es das nicht im Framework gibt und hier auf dem Forum auch nicht, dann werd ich das mal schreiben und anschließend hier veröffentlichen^^

Und ja etwas offtopic ist das, deshalb halt ich hier jetzt auch meine Klappe ^^

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.