private static Size DecodeJfif(SequentialBinaryReader reader) { reader.IsBigEndian = true; var magicNumber = reader.ReadUInt16(); // first two bytes should be JPEG magic number do { // Find next segment marker. Markers are zero or more 0xFF bytes, followed // by a 0xFF and then a byte not equal to 0x00 or 0xFF. byte segmentIdentifier = reader.ReadByte(); byte segmentType = reader.ReadByte(); // Read until we have a 0xFF byte followed by a byte that is not 0xFF or 0x00 while (segmentIdentifier != 0xFF || segmentType == 0xFF || segmentType == 0) { segmentIdentifier = segmentType; segmentType = reader.ReadByte(); } if (segmentType == 0xD9) // EOF? { return(Size.Empty); } // next 2-bytes are <segment-size>: [high-byte] [low-byte] var segmentLength = (int)reader.ReadUInt16(); // segment length includes size bytes, so subtract two segmentLength -= 2; if (segmentType == 0xC0 || segmentType == 0xC2) { reader.ReadByte(); // bits/sample, usually 8 int height = (int)reader.ReadUInt16(); int width = (int)reader.ReadUInt16(); return(new Size(width, height)); } else { // skip this segment reader.Skip(segmentLength); } }while (true); }
/// <summary> /// Examines the a file's first bytes and estimates the file's type. /// </summary> private static FileType DetectFileType(SequentialBinaryReader reader) { byte[] magicBytes = new byte[MaxMagicBytesLength]; for (int i = 0; i < MaxMagicBytesLength; i += 1) { magicBytes[i] = reader.ReadByte(); foreach (var kvPair in imageFormatDecoders) { if (StartsWith(magicBytes, kvPair.Key)) { return(kvPair.Value); } } } return(FileType.Unrecognized); }