2017-04-10 87 views
0

由於0xFFD9沒有必要存在於JPEG圖像(如EOF標記物),並且即使它存在時,它可能會由於在JPEG嵌入的縮略圖得到不正確的結果,所以我需要解析JPEG提取任何附加數據(例如, g zip)。我有以下的java代碼基於假設一個標記將跟隨2個字節的長度。但是SOS段即0xFFDA標記不是這種情況。我如何檢測JPEG中的EOF?如何在jpeg圖像的末尾提取附加數據(檢測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(); 
} 

回答

0

我不認爲你需要檢測結束。

如果您自己正在生成消息,那麼您可以轉至包含圖像的字節數組的末尾,並檢測是否存在EOI (ddf9)如果不存在,則只需將其添加並添加消息即可。

由於EOI被認爲是圖像的結束,你可以自己添加它,即使它已經存在。

當讀取從文件末尾讀你的消息,並檢測ddf9(可能存在的消息本身,所以最好是選擇一個較長的分離像@@[email protected]@和檢測。

例如給定的圖像下面

a certain black hole

可以產生圖像陣列如下面

enter image description here

+0

不,我不生產消息自己。我的程序將接受任何圖像並提取附加數據(隱寫)。 –