コード例 #1
0
        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);
        }