2017-04-10 1 views
0

Comme 0xFFD9 n'est pas nécessaire pour être présent dans l'image JPEG (comme marqueur EOF) et même s'il est présent, il peut donner un résultat incorrect en raison de la vignette incorporée en jpeg, donc j'ai besoin d'analyser JPEG pour extraire g zip). J'ai le code Java suivant basé sur l'hypothèse qu'un marqueur sera suivi par 2 longueur d'octets. Mais ce n'est pas le cas avec le segment SOS, c'est-à-dire le marqueur 0xFFDA. Comment puis-je détecter EOF en JPEG?Comment extraire des données ajoutées à la fin de l'image jpeg (détection de jpeg EOF).

public String getJPEGAppendedData(DataInputStream in) { 
    StringBuilder message = new StringBuilder(); 
    try { 
     // reading first two bytes 0xFFD8 
     in.readFully(new byte[2]); 

     // 0xFFXX 
     byte twoBytes[] = new byte[2]; 

     while (true) { 
      in.readFully(twoBytes); 
      if (twoBytes[0] == (byte) 0xFF) { 
        if (twoBytes[1] == (byte) 0xDD) { 
         // fixed 4 bytes payload 
         in.readFully(new byte[4]); 
        } else if (twoBytes[1] == (byte) 0xD9) { 
         // end of image reached 
         break; 
        } else if (twoBytes[1] >= (byte) 0xD0 && twoBytes[1] <= (byte) 0xD7) { 
         // no payload 
        } else { 
         // reading payload length form two bytes 
         short length = in.readShort(); 
         System.out.println(length); 

         // skipping payload 
         for (int i = 1; i <= length - 2; i++) { 
          in.readByte(); 
         } 
        } 
      } else { 
       break; 
      } 
     } 

     // reading appended data (byte by byte) if any 
     boolean moreData = true; 
     while (moreData) { 
      try { 
       byte b = in.readByte(); 
       message.append(String.format("%02X", b)); 
      } catch (Exception e) { 
       moreData = false; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return message.toString(); 
} 

Répondre

0

Je ne pense pas que vous devez détecter la fin.

Si vous produisez vous-même le message, vous pouvez simplement aller à la fin du tableau d'octets contenant l'image et détecter s'il y a un EOI (ddf9) sinon ajoutez-le là et ajoutez votre message.

Puisque EOI est censé être la fin de l'image, vous pouvez l'ajouter vous-même, même s'il est déjà présent.

Lors de la lecture votre message lu à partir de la fin du fichier et détecter ddf9 (qui peut être présent dans le message lui-même, il est donc préférable de choisir un séparateur plus comme @@[email protected]@ et détecter.

Par exemple l'image donnée ci-dessous

a certain black hole

Vous pouvez produire tableau d'image ci-dessous

enter image description here

+0

Non, je ne produis pas de message moi-même. Mon programme acceptera n'importe quelle image et extraira les données ajoutées le cas échéant (stéganographie). –