2010-11-25 17 views
1

J'ai une image JPEG formatée JFIF. Je veux le décoder et obtenir la dimension.Décoder un fichier image JFIF en C#

Voici mon 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. Ce morceau de code est commun et vous pouvez le trouver partout sur Internet. Cela fonctionne très bien pour la plupart des images JPEG. Maintenant, cette image spécifique qui a été prise par l'appareil photo - "Canon EOS 300D DIGITAL", ne supporte pas ce morceau de code. Le marqueur de la cote est 0xFFC2 au lieu de 0xFFC0.

Ma question est celle qui est correcte? Si le code est correct, alors comment un appareil photo Canon peut-il produire une image non standard? Si l'appareil photo Canon est correct, alors comment pouvons-nous corriger le code pour corriger trouver la dimension de cette image?

Merci. Le FFC2 semble être le marqueur pour les images progressives

Répondre

3

Veuillez voir par exemple http://en.wikipedia.org/wiki/JPEG qui explique le format "progressif" (voir la section "compression JPEG"). Oui, je pense que vous pouvez changer votre instruction if pour vérifier à la fois 0xc0 (marqueur SOF0) et 0xc2 (marqueur SOF2) car ils semblent avoir une structure similaire (voir la section "syntaxe et structure"). voir aussi ici: http://fjcore.googlecode.com/svn/trunk/FJCore/Decoder/JpegDecoder.cs

Je ne suis pas expert dans les formats JPEG, vous devriez donc consulter des forums spécialisés si vous développez un code critique.

+0

Qu'est-ce qu'une image progressive? Cela signifie-t-il que nous avons besoin d'une autre méthode pour décoder l'image jpeg progressive? Puis-je changer if (marqueur == 0xc0) à if (marqueur == 0xc0 || marqueur == 0xc2) pour résoudre le problème? – delpielo

+0

J'ai mis à jour ma réponse – akonsu