コード例 #1
0
        /* Parse FUJI information */
        /* It is a simpler form of Tiff IFD, so we add them as TiffEntries */
        void ParseFuji(uint offset)
        {
            try
            {
                IFD tempIFD = new IFD(ifd.endian, ifd.Depth);
                ImageBinaryReaderBigEndian bytes = new ImageBinaryReaderBigEndian(stream, offset);
                uint entries = bytes.ReadUInt32();

                if (entries > 255)
                {
                    throw new RawDecoderException("Too many entries");
                }

                for (int i = 0; i < entries; i++)
                {
                    UInt16 tag    = bytes.ReadUInt16();
                    uint   length = bytes.ReadUInt16();
                    Tag    t;

                    // Set types of known tags
                    switch (tag)
                    {
                    case 0x100:
                    case 0x121:
                    case 0x2ff0:
                        t = new Tag((TagType)tag, TiffDataType.SHORT, length / 2);
                        for (int k = 0; k < t.dataCount; k++)
                        {
                            t.data[k] = bytes.ReadUInt16();
                        }
                        break;

                    case 0xc000:
                        // This entry seem to have swapped endianness:
                        t = new Tag((TagType)tag, TiffDataType.LONG, length / 4);
                        for (int k = 0; k < t.dataCount; k++)
                        {
                            t.data[k] = bytes.ReadUInt32();
                        }
                        break;

                    default:
                        t = new Tag((TagType)tag, TiffDataType.UNDEFINED, length);
                        for (int k = 0; k < t.dataCount; k++)
                        {
                            t.data[k] = bytes.ReadByte();
                        }
                        break;
                    }
                    tempIFD.tags.Add(t.TagId, t);
                    //bytes.ReadBytes((int)length);
                }
                ifd.subIFD.Add(tempIFD);
            }
            catch (IOException)
            {
                throw new RawDecoderException("IO error occurred during parsing. Skipping the rest");
            }
        }