Advertisement
Guest User

JPEG parser

a guest
Mar 2nd, 2014
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.30 KB | None | 0 0
  1.     class JpegParser
  2.     {
  3.         const UInt16 SOI = 0xffd8,
  4.                      TEM = 0xff01,
  5.                      RSTmin = 0xffd0,
  6.                      RSTmax = 0xffd7,
  7.                      EOI = 0xffd9,
  8.                      MARKmin = 0xff01,
  9.                      MARKmax = 0xfffe;
  10.  
  11.         byte[] data;
  12.         long startIndex;
  13.         public JpegParser(byte[] data, long startIndex)
  14.         {
  15.             this.data = data;
  16.             this.startIndex = startIndex;
  17.         }
  18.  
  19.         public bool HasJpegHeader()
  20.         {
  21.             if (data.LongLength < startIndex + 4)
  22.                 return false;
  23.  
  24.             var soi = GetBigEndianInt16(startIndex);  // Start of Image (SOI) marker (FFD8)
  25.             int jfif = GetBigEndianInt16(startIndex + 2); // JFIF marker (FFE0)
  26.  
  27.             return soi == 0xffd8 && jfif == 0xffe0;
  28.         }
  29.  
  30.         UInt16 GetBigEndianInt16(long index)
  31.         {
  32.             return (UInt16)(data[index] << 8 | data[index + 1]);
  33.         }
  34.  
  35.         // exception means bad image format
  36.         public long? SkipJpegHeader()
  37.         {
  38.             try
  39.             {
  40.                 long currIndex = startIndex;
  41.  
  42.                 // read out soi
  43.                 if (GetBigEndianInt16(currIndex) != 0xffd8)
  44.                     return null;
  45.                 currIndex += 2;
  46.  
  47.                 while (currIndex < data.LongLength)
  48.                 {
  49.                     var next = GetBigEndianInt16(currIndex);
  50.                     currIndex += 2;
  51.  
  52.                     if (next == SOI)
  53.                         return null;
  54.  
  55.                     if (next == TEM)
  56.                         continue;
  57.  
  58.                     if (next >= RSTmin && next <= RSTmax)
  59.                         continue;
  60.  
  61.                     if (next == EOI)
  62.                         return currIndex;
  63.  
  64.                     if (next >= MARKmin && next <= MARKmax)
  65.                     {
  66.                         // we found a marker, skip the section
  67.                         currIndex += GetBigEndianInt16(currIndex);
  68.                         continue;
  69.                     }
  70.  
  71.                     currIndex -= 1;
  72.                 }
  73.                 return null;
  74.             }
  75.             catch (IndexOutOfRangeException)
  76.             {
  77.                 return null;
  78.             }
  79.         }
  80.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement