Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class JpegParser
- {
- const UInt16 SOI = 0xffd8,
- TEM = 0xff01,
- RSTmin = 0xffd0,
- RSTmax = 0xffd7,
- EOI = 0xffd9,
- MARKmin = 0xff01,
- MARKmax = 0xfffe;
- byte[] data;
- long startIndex;
- public JpegParser(byte[] data, long startIndex)
- {
- this.data = data;
- this.startIndex = startIndex;
- }
- public bool HasJpegHeader()
- {
- if (data.LongLength < startIndex + 4)
- return false;
- var soi = GetBigEndianInt16(startIndex); // Start of Image (SOI) marker (FFD8)
- int jfif = GetBigEndianInt16(startIndex + 2); // JFIF marker (FFE0)
- return soi == 0xffd8 && jfif == 0xffe0;
- }
- UInt16 GetBigEndianInt16(long index)
- {
- return (UInt16)(data[index] << 8 | data[index + 1]);
- }
- // exception means bad image format
- public long? SkipJpegHeader()
- {
- try
- {
- long currIndex = startIndex;
- // read out soi
- if (GetBigEndianInt16(currIndex) != 0xffd8)
- return null;
- currIndex += 2;
- while (currIndex < data.LongLength)
- {
- var next = GetBigEndianInt16(currIndex);
- currIndex += 2;
- if (next == SOI)
- return null;
- if (next == TEM)
- continue;
- if (next >= RSTmin && next <= RSTmax)
- continue;
- if (next == EOI)
- return currIndex;
- if (next >= MARKmin && next <= MARKmax)
- {
- // we found a marker, skip the section
- currIndex += GetBigEndianInt16(currIndex);
- continue;
- }
- currIndex -= 1;
- }
- return null;
- }
- catch (IndexOutOfRangeException)
- {
- return null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement