2010-11-25 7 views
1

Ich habe ein JPEG-Bild, das JFIF-formatiert ist. Ich möchte es entschlüsseln und die Dimension bekommen.Eine JFIF-Bilddatei in C# decieren

Hier ist mein Code:

while (binaryReader.ReadByte() == 0xff) 
     { 
      byte marker = binaryReader.ReadByte(); 
      ushort chunkLength = binaryReader.ReadLittleEndianInt16(); 

      if (marker == 0xc0) 
      { 
       binaryReader.ReadByte(); 

       int height = binaryReader.ReadLittleEndianInt16(); 
       int width = binaryReader.ReadLittleEndianInt16(); 
       return new Size(width, height); 
      } 

      binaryReader.ReadBytes(chunkLength - 2); 
     } 

Ok. Dieses Stück Code ist üblich und Sie können es überall im Internet finden. Es funktioniert gut für die meisten JPEG-Bilder.

Nun, dieses spezielle Bild, das von der Kamera aufgenommen wurde - "Canon EOS 300D DIGITAL", unterstützt dieses Stück Code nicht. Der Marker für die Dimension ist 0xFFC2 anstelle von 0xFFC0.

Meine Frage ist welche ist richtig? Wenn der Code korrekt ist, wie kann dann eine Canon-Kamera ein nicht standardmäßiges Bild erzeugen? Wenn die Canon-Kamera korrekt ist, wie können wir den Code korrigieren, um die Dimension dieses Bildes zu finden?

Danke.

Antwort

3

FFC2 scheint der Marker für progressive Bilder zu sein.

siehe zum Beispiel http://en.wikipedia.org/wiki/JPEG was erklärt, was "progressive" Format ist (siehe Abschnitt "JPEG-Komprimierung").

Ja, ich denke, Sie können Ihre if-Anweisung ändern, um sowohl 0xc0 (SOF0-Marker) als auch 0xc2 (SOF2-Marker) zu überprüfen, da sie eine ähnliche Struktur zu haben scheinen (siehe Abschnitt "Syntax und Struktur"). siehe auch hier: http://fjcore.googlecode.com/svn/trunk/FJCore/Decoder/JpegDecoder.cs

ich bin kein Experte für JPEG-Formate, deshalb sollten Sie sich in spezialisierten Foren erkundigen, ob Sie einen unternehmenskritischen Code entwickeln.

+0

Was ist ein progressives Bild? Bedeutet das, dass wir eine andere Methode brauchen, um progressives JPEG-Bild zu dekodieren? Kann ich if (marker == 0xc0) zu if (marker == 0xc0 || marker == 0xc2) ändern, um das Problem zu lösen? – delpielo

+0

Ich habe meine Antwort aktualisiert – akonsu