/// <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?) }
/// <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)); } }
/// <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); }
/// <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?) }