public RAFDecoder(Stream file) : base(file, true) { //alt_layout = false; // FUJI has pointers to IFD's at fixed byte offsets // So if camera is FUJI, we cannot use ordinary TIFF parser //get first 8 char and see if equal fuji file.Position = 0; var data = new byte[110]; file.Read(data, 0, 8); string dataAsString = System.Text.Encoding.UTF8.GetString(data.Take(8).ToArray()); if (dataAsString != "FUJIFILM") { throw new RawDecoderException("Header is wrong"); } //Fuji is indexer reverse endian reader = new ImageBinaryReaderBigEndian(file); reader.BaseStream.Position = 8; //read next 8 byte dataAsString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(8).ToArray()).Trim(); //4 byte version var version = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(4).ToArray()); //8 bytes unknow ?? var unknow = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(8).ToArray()).Trim(); //32 byte a string (camera model) dataAsString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(32).ToArray()).Trim(); //Directory //4 bytes version version = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(4).ToArray()); //20 bytes unkown ?? dataAsString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(20).ToArray()).Trim(); //parse the ifd uint first_ifd = reader.ReadUInt32(); relativeOffset = first_ifd + 12; reader.ReadInt32(); //raw header // RAW information IFD on older uint third_ifd = reader.ReadUInt32(); reader.ReadUInt32(); uint secondIFD = reader.ReadUInt32(); uint count = reader.ReadUInt32(); try { Parse(secondIFD); } catch (Exception) { //old format ifd = new IFD(Endianness.Big, 0); //raw image var entry = new Tag(TagType.FUJI_STRIPOFFSETS, TiffDataType.LONG, 1); entry.data[0] = secondIFD; ifd.tags.Add(entry.TagId, entry); entry = new Tag(TagType.FUJI_STRIPBYTECOUNTS, TiffDataType.LONG, 1); entry.data[0] = count; ifd.tags.Add(entry.TagId, entry); } Parse(first_ifd + 12); ParseFuji(third_ifd); }