C# .gif analysieren - Wie läd man die Metadaten (Breite, Höhe, etc)?

pinguSTAR

Ensign
Registriert
Juni 2010
Beiträge
171
Hallo Zusammen,

ich muss in meiner Hausaufgabe ein Programm in C# schreiben welches .gif Dateien analysiert.

Die Aufgabe ist wie folgt beschrieben:

Schreiben Sie ein Programm, das eine GIF-Datei analysiert. Besorgen Sie sich dazu (aus dem Internet oder von mir) eine Beschreibung des Aufbaus einer Gif-Datei. Schreiben Sie dann ein Programm, das den Namen einer Gif-Datei erfragt und dann wenigstens folgende Angaben bestimmt:

- Wie groß ist das Bild, das die Gif-Datei beschreibt?
- Wie viele Farben verwendet das Bild?
- Verwendet das Bild das Zeilensprungverfahren (Interlacing)

Im Prinzip kein Problem, ich habe hier eine gute Beschreibung gefunden: klick allerdings weiß ich nicht genau wie ich die Bytes laden kann.

Wäre über tips super dankbar!

Grüße
pingu
sss
 
"Bytes laden" -> Datei öffnen, mit Binärflag und dann gegenprüfen.
 
@Verata: hmm ich denke schon das wir es nutzen dürfen.

allerdings sagt mir das nichts?!

@Syma: Wie das Format aufgebaut ist ist mir bekannt - wie ich oben ja auch beschrieben habe. Allerdings weiss ich nicht wie man die Bytes in C# laed.

@Yuuri: Binaerflag?? Hast du vielleicht ein Codeschnipsel fuer mich?

Danke schonmal :)
 
Zuletzt bearbeitet:
Die GDI+ ist die Grafikschnittstelle des .NET Frameworks. Da sind Funktionen für all diese infos bereits implementiert. Du lädst das Bild in ein Bitmap Opbjekt und kannst dann alle Eigenschaften auslesen.

Edit:
Ich muss mich korrigieren. Mit der GDI+ bekommst du nur Informationen zu dem in den RAM geladenen Bild. Da das Interlacing hier keine Rolle mehr spielt, musst du dir die Info anders besorgen.
 
Zuletzt bearbeitet:
pinguSTAR schrieb:
Binaerflag?? Hast du vielleicht ein Codeschnipsel fuer mich?
Liest nur den Header aus und vergleicht ihn mit der Spezifikation:
Code:
string filename = @"D:\##-#-#-#1.gif";
FileStream f = new FileStream( filename, FileMode.Open, FileAccess.Read );
BinaryReader b = new BinaryReader( f );

byte[] gifheader = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 };
byte[] buf = b.ReadBytes( 6 );

if( gifheader.SequenceEqual( buf ) )
	Debug.WriteLine( filename + " is a gif file" );
else
	Debug.WriteLine( filename + " is not a gif file" );

b.Close();
f.Close();
 
top - BinaryReader war das Schlüsselwort! Vielen Dank Yuuri!!


@SymA: Google hilft sicher, aber wenn man nicht weiß nach was man googeln musss ... danke trotzdem :)
 
Als Anmerkung vielleicht noch: Die obige Variante ist eigentlich schlechter Stil - C# besitzt dafür die using-Direktive.
Code:
string filename = @"D:\##-#-#-#1.gif";

using( BinaryReader b = new BinaryReader( File.Open( filename, FileMode.Open, FileAccess.Read ) ) )
{
	byte[] gifheader = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 };
	byte[] buf = b.ReadBytes( 6 );

	Debug.WriteLine( string.Join( ",", gifheader ) );
	Debug.WriteLine( string.Join( ",", buf ) );
	if( gifheader.SequenceEqual( buf ) )
		Debug.WriteLine( filename + " is a gif file" );
	else
		Debug.WriteLine( filename + " is not a gif file" );
}
Damit umgehst du, dass eventuell Daten noch im RAM verbleiben. Der GC räumt hier komplett selbstständig auf, wenn der Zweig verlassen wird.
 
Yuuri schrieb:
Damit umgehst du, dass eventuell Daten noch im RAM verbleiben. Der GC räumt hier komplett selbstständig auf, wenn der Zweig verlassen wird.

Das hat dein vorheriges Snippet aber auch schon gemacht. Close ruft implizit dispose auf :) Eleganter ist es natürlich schon, und man spart den Close auf dem FileStream, das stimmt.
 
Zuletzt bearbeitet:
Zurück
Oben