コード例 #1
0
        /// <summary>
        /// Loads TIFF header from stream.
        /// </summary>
        /// <param name="stream">Fully formatted TIFF image.</param>
        /// <returns>Length of header.</returns>
        protected override long Load(Stream stream)
        {
            base.Load(stream);
            byte[] temp = stream.ReadBytes(8);

            if (!CheckIdentifier(temp))
            {
                throw new FormatException("Stream is not a recognised TIFF image.");
            }

            // Change byte order if required.
            if (temp[0] == 'M')
            {
                endianness = MyBitConverter.Endianness.BigEndian;
            }

            // Header
            FirstImageOffset = MyBitConverter.ToUInt32(temp, 4, endianness);
            stream.Seek(FirstImageOffset, SeekOrigin.Begin);
            var IFD = new ImageFileDirectory(stream, endianness);

            Pages = new List <ImageFileDirectory>()
            {
                IFD
            };

            // Add mipmaps if they exist
            while (IFD.NextIFDOffset != 0)
            {
                IFD = new ImageFileDirectory(stream, endianness);
                Pages.Add(IFD);
            }

            return(0); // No sensible return value since header is not contiguous (right?)
        }
コード例 #2
0
            /// <summary>
            /// Read sub image header.
            /// </summary>
            /// <param name="stream">Stream to read local header from.</param>
            /// <param name="endianness">Big or little, as defined by TIFF header.</param>
            public ImageFileDirectory(Stream stream, MyBitConverter.Endianness endianness) : this()
            {
                var bytes = stream.ReadBytes(2);

                NumberOfEntries  = MyBitConverter.ToUInt16(bytes, 0, endianness);
                FieldDescriptors = new List <FieldDescriptor>();


                for (int i = 0; i < NumberOfEntries; i++)
                {
                    bytes = stream.ReadBytes(12);
                    FieldDescriptors.Add(new FieldDescriptor(bytes, endianness, stream));
                }
            }
コード例 #3
0
                /// <summary>
                /// Read field descriptor from block.
                /// A "property" of the image.
                /// </summary>
                /// <param name="IDBlock">Block containing descriptor, but NOT it's data.</param>
                /// <param name="endianness">Big or little endianness defined by TIFF header.</param>
                /// <param name="dataStream">Full image stream to read descriptor data from.</param>
                public FieldDescriptor(byte[] IDBlock, MyBitConverter.Endianness endianness, Stream dataStream)
                {
                    FieldTag    = (FieldTags)MyBitConverter.ToInt16(IDBlock, 0, endianness);
                    FieldType   = (FieldTypes)MyBitConverter.ToInt16(IDBlock, 2, endianness);
                    FieldLength = MyBitConverter.ToInt32(IDBlock, 4, endianness);
                    DataOffset  = MyBitConverter.ToInt32(IDBlock, 8, endianness);

                    // Read data indicated by descriptor
                    long oldOffset = dataStream.Position;

                    dataStream.Seek(DataOffset, SeekOrigin.Begin);
                    Data = new byte[FieldLength];
                    dataStream.Read(Data, 0, FieldLength);

                    // Reset stream position for next descriptor
                    dataStream.Seek(oldOffset, SeekOrigin.Begin);
                }
コード例 #4
0
        /// <summary>
        /// Loads TIFF header from stream.
        /// </summary>
        /// <param name="stream">Fully formatted TIFF image.</param>
        /// <returns>Length of header.</returns>
        protected override long Load(Stream stream)
        {
            base.Load(stream);
            byte[] temp = stream.ReadBytes(8);

            if (!CheckIdentifier(temp))
                throw new FormatException("Stream is not a recognised TIFF image.");

            // Change byte order if required.
            if (temp[0] == 'M')
                endianness = MyBitConverter.Endianness.BigEndian;

            // Header
            FirstImageOffset = MyBitConverter.ToUInt32(temp, 4, endianness);
            stream.Seek(FirstImageOffset, SeekOrigin.Begin);
            var IFD = new ImageFileDirectory(stream, endianness);
            Pages = new List<ImageFileDirectory>() { IFD };

            // Add mipmaps if they exist
            while (IFD.NextIFDOffset != 0)
            {
                IFD = new ImageFileDirectory(stream, endianness);
                Pages.Add(IFD);
            }

            return 0; // No sensible return value since header is not contiguous (right?)
        }