WinFuture-Forum.de: C# Dateiformat Aus Binärdatei Auslesen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 3 Seiten +
  • 1
  • 2
  • 3

C# Dateiformat Aus Binärdatei Auslesen


#1 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

  geschrieben 30. März 2005 - 09:16

Hallo zusammen!

Habe ein C# Problem, bei dem ich nicht weiterkomme:

Um eine Bild in einer Datenbank zu speichern, wandle ich es vorher in eine Binärdatei um:

string path = @"c:\myImage.jpg";
System.IO.FileStream stream = System.IO.File.OpenRead(path);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();

//Anschließend wird 'bytes' als Blob in der Datenbank gespeichert.


Das Auslesen der Datei über einen MemoryStream funktioniert eigentlich auch ganz gut:

byte[] bytes = (byte[]) view[0]["Image1"];
System.IO.MemoryStream stream = new System.IO.MemoryStream(bytes);
System.Drawing.Image image = System.Drawing.Image.FromStream(stream);


Allerdings liefert mir die Eigenschaft 'ImageType' der Objektvariablen 'image' immer 'Bitmap' zurück! Wie kann ich feststellen, dass es sich bei der Datei in dem ByteArray eigentlich um ein Jpg handelt?

Kann mir jemand helfen?

Grüßle

:) liver
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 30. März 2005 - 11:57

Hast du es mal mit Serialisieren versucht? Weil das eigentlich die Art ist, Objekte in Dateien bzw. Datenbanken zu speichern
0

#3 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

geschrieben 30. März 2005 - 12:33

Hi Witi!

Mhm, worin liegt der Unterschied?
Wenn ich eine Datei serialisiere, dann wird sie in ein binäres Foramt umgewandelt:

Image image = Image.FromFile(@"C:\myImage.jpg");
System.IO.MemoryStream stream = new System.IO.MemoryStream();
BinaryFormatter formater = new BinaryFormatter();
formater.Serialize(stream, image);
stream.Seek(0, 0);

Das Ergebnis ist jedenfalls identisch!

Oder verstehe ich dich jetzt falsch?

Wie kann ich dann aber beim Deserialisieren den Dateityp feststellen?
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 30. März 2005 - 12:36

Da haste recht, es wird schon in eine "binäre Art" umgewandelt.
Beim Deserialisieren kriegste ein Objekt vom Typ object. Das musst du nur noch in ein Image-Objekt casten.
0

#5 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

  geschrieben 30. März 2005 - 12:44

Zitat (Witi: 30.03.2005, 12:36)

Das musst du nur noch in ein Image-Objekt casten.
<{POST_SNAPBACK}>


Jep, und genau da liegt mein Problem :rofl:

beim Auslesen
System.Drawing.Image image = System.Drawing.Image.FromStream(stream);

erhält das Image als DataType 'Bitmap' obwohl es sich ja eigentlich um ein Jpeg handelt

Weist du wie ich an die Header-Informationen einer Datei kommen kann? Denn hier müsste der Datentyp gespeichert sein.

Dieser Beitrag wurde von tooligan bearbeitet: 30. März 2005 - 13:27

0

#6 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 30. März 2005 - 13:48

Versuch doch einfach mal anstatt des Streams den BinaryFormatter zu benutzen. Ich wette, dass es dann funktioniert (Da ich auf der Arbeit bin, kann ich es leider nicht selber testen...)
0

#7 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

geschrieben 30. März 2005 - 14:48

Prima Idee!!! ;D

Hab's dann in 'nem Beispiel gleich mal ausprobiert:

Image image = Image.FromFile(@"C:\myImage.jpg");
System.IO.MemoryStream stream = new System.IO.MemoryStream();
BinaryFormatter formater = new BinaryFormatter();
formater.Serialize(stream, image);
stream.Seek(0, 0);

object o = formater.Deserialize(stream);


Aber leider steckt in 'o' ein System.Drawing.Bitmap mit dem ImageType 'Bitmap' :rofl:
0

#8 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 30. März 2005 - 14:52

hmm...dann weiß ich leider auch nicht weiter.
Wenn ich zu Hause, bin probiere ich das mal selber aus.

Wie ist eigentlich der ImageType vor dem Serialisieren?
Wehe, der ist auch Bitmap!! :rofl:
0

#9 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

geschrieben 30. März 2005 - 15:09

Ups - tatsächlich .... :rofl:

Neeee, war nur 'n Scherz - vor dem Serialisieren war er vom Typ Jpeg

Danke für deine Bemühungen!

;D liver

PS
Anbei noch der Quellcode
Angehängte Datei  WindowsApplication40.zip (22,75K)
Anzahl der Downloads: 326

Dieser Beitrag wurde von tooligan bearbeitet: 30. März 2005 - 15:19

0

#10 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 30. März 2005 - 15:26

Den SourceCode gucke ich mir mal an, wenn ich zu Hause bin.
Dürfte aber heute was dauern, bis ich zu Hause bin (Guck bei mir im Profil auf ein bestimmtes Datum, dann weißt du warum :thumbsup:)
0

#11 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

geschrieben 30. März 2005 - 15:33

:)
Dein Geburtstag ist heut
Ja das freut alle Leut
Und drum sing ich im Nu
"Happy birthday to you"

Alles Gute!

:thumbsup: liver
0

#12 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 30. März 2005 - 15:46

Hehehe...Danke, danke! :thumbsup:
0

#13 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

geschrieben 31. März 2005 - 17:48

Hier eine Lösung für alle die es interessiert:

Jpg-Dateien sind eigentlich JFIF (JPEG File Interchange
Format)-Dateien, die einen bestimmten Header besitzen, an den sich das Bild
anschließt.

Das Format des Headers ist festgelegt. In der JFIF-Spezifikation
(Version 1.02, http://www.jpeg.org/public/jfif.pdf )

Unter anderem wird in der Spezifikation auch folgender Tip gegeben:

"you can identify a JFIF file by looking for the following sequence: X'FF',
SOI, X'FF', APP0, <2 bytes to be skipped>, "JFIF", X'00'."

Die Bytes 7 bis 10 enthalten also laut Spezifikation (!) die Information,
dass es sich um eine JFIF-Datei handelt. Um ganz genau zu sein, müsste man
also die ersten elf Bytes prüfen (müssen FFD8 FFE0 .... 4A 46 49 46 00 sein).

Die Bytes "4A 46 49 46" enthalten also die Information "JFIF".

Bei anderen Dateiformaten ist es übrigens ähnlich, z. B. beginnen PDF-Dateien mit
25 50 44 46 ...
also mit "%PDF", daran schließt sich die PDF-Version an.

Es wird mir also wohl nicht anderes übrig bleiben, als den Header auszulesen. :rolleyes:

Beste Grüße und vielen Dank für die Tips an Michael V. und Frank D.
0

#14 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 01. April 2005 - 07:09

so...Sorry, dass ich erst so spät antworte, aber ich bin einfach nicht früher dazu gekommen. Aber ich habs (natürlich :imao:) hinbekommen...du brauchst keinen Header auslesen. Jpeg rein -> Jpeg raus. Der Trick dabei ist die ImageFormat-Klasse.
Mit diesem Code klappt es:
  Image image = Image.FromFile("test.jpg");
  MemoryStream stream = new MemoryStream();

  BinaryFormatter formatter = new BinaryFormatter();
  formatter.Serialize(stream, image);

  stream.Seek(0,0);

  image = (Image)formatter.Deserialize(stream);

  if (image.RawFormat.Equals(ImageFormat.Jpeg))
 	 Console.WriteLine("Es handelt sich um eine Jpg-Datei!");


Im Anhang schicke ich dir den ganzen Quellcode (NATÜRLICH NICHT IN VS GESCHRIEBEN ;))

EDIT: MODS, WARUM KANN ICH KEINE .CS-DATEIEN HOCHSCHICKEN?

Der Quelltext ist zum Glück nicht allzu groß:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class Bild
{
	public static void Main()
	{
  Image image = Image.FromFile("test.jpg");
  MemoryStream stream = new MemoryStream();

  BinaryFormatter formatter = new BinaryFormatter();
  formatter.Serialize(stream, image);

  stream.Seek(0,0);

  image = (Image)formatter.Deserialize(stream);

  if (image.RawFormat.Equals(ImageFormat.Jpeg))
 	 Console.WriteLine("Es handelt sich um eine Jpg-Datei!");
	}

}

Dieser Beitrag wurde von Witi bearbeitet: 01. April 2005 - 07:12

0

#15 Mitglied ist offline   tooligan 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 29. März 05
  • Reputation: 0
  • Wohnort:München
  • Interessen:C#, .NET WinForms, ASP.NET, C++, Java

  geschrieben 01. April 2005 - 09:00

Hey Witi!

Klasse! So funktioniert es! :imao:
(Manchmal sieht man halt den Wald vor lauter Bäumen nicht.)

Wie ist das dann aber bei anderen Dateiformaten? Z.B. PDF ?
Bin gerade dabei eine Klasse zu bauen, die die Header Daten einer Datei ausliest und das Format zurückgibt. Ist dir so eine Klasse bereits bekannt?
0

Thema verteilen:


  • 3 Seiten +
  • 1
  • 2
  • 3

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0